前言

遇到这个问题,是由于自己在mvc项目中使用vue而并不想jquery(人嘛,就是要折腾),并且表单中的一个属性是一个集合。

研究了下Razor如何实现的,用jquery感觉就挺麻烦了,vue用在数据绑定方面好强好方便,灵活运用后感觉很棒。

Razor模板的确强大,TagHelper书写太爽快了,但是数据修改后的更新需要在前端利用jquery进行修改,感觉挺可惜的,不知道有没有更方便的。

Razor是如何实现

首先我们简单定义一下结构

     public class Movie
     {
         public int Id { get; set; }
         public string Name { get; set; }
         public List<Pseron> Persons { get; set; } = new List<Pseron>();
     }
     public class Pseron
     {
         public int Id { get; set; }
         public string Name { get; set; }
         public int Age { get; set; }
     }

接着创建一个Action

         public IActionResult List()
         {
             Movie movie = new Movie();
             movie.Id = ;
             movie.Name = "猫和老鼠";
             movie.Persons.Add(, Name =  });
             movie.Persons.Add(, Name =  });
             return View(movie);
         }

然后我们在视图里简单的显示一下

 @model Movie

 <form asp-action="List">
     <div class="form-group">
         <label asp-for="Id"></label>
         <input class="form-control" asp-for="Id" />
     </div>
     <div class="form-group">
         <label asp-for="Name"></label>
         <input class="form-control" asp-for="Name" />
     </div>
     <table class="table">
         <thead>
             <tr>
                 <td>序号</td>
                 <td>Id</td>
                 <td>Name</td>
                 <td>Age</td>
             </tr>
         </thead>
         <tbody>
             @for (int i = 0; i < Model.Persons.Count; i++)
             {
                 <tr>
                     <td>@(i + 1)</td>
                     <td><input class="form-control" asp-for="Persons[i].Id" /></td>
                     <td><input class="form-control" asp-for="Persons[i].Name" /></td>
                     <td><input class="form-control" asp-for="Persons[i].Age" /></td>
                 </tr>
             }
         </tbody>
     </table>
 </form>

最后我们查看下结果

观察结论

众所周知,提交form时依据的是name属性,Razor模板渲染的时候,按照 “ 属性[索引].属性 ”的形式作为name赋值,那么我们只要依样画葫芦就可以了。

需要注意的是,索引必须从0开始,且索引应该连续。这时候就觉得用jQuery去控制增删就麻烦很多。vue在这个时候有一点点小方便。

让我们看看如何用vue去实现

同样的我们建立一个Action(偷懒,没建HttpPost请求),这里我们需要将数据转换为json字符串,然后在视图里再转换为json让vue去渲染

         public IActionResult ListVue(Movie movie)
         {
             movie = movie ?? new Movie();
             ViewData["Data"] = System.Text.Json.JsonSerializer.Serialize(movie);
             return View();
         }

然后建立一个视图并用vue去渲染数据,这里用了@Html.Raw()处理了一下字符串,不然双引号会被处理成转义字符。

添加新行的只需要向数组中插入一个对象就完成了,而且索引只需要vue去管理就可以了,体验一级棒!!!

删行也非常简单!!!

 @{
     var Data = ViewData["Data"].ToString();
 }

 <div id="app">
     <form asp-action="ListVue">
         <div class="form-group">
             <label>Id</label>
             <input class="form-control" name="Id" v-model="movie.Id" />
         </div>
         <div class="form-group">
             <label>Name</label>
             <input class="form-control" name="Name" v-model="movie.Name" />
         </div>
         <a href="javascript:void(0)" class="btn btn-primary mb-1" @@click="NewRow()">插入新行</a>
         <table class="table">
             <thead>
                 <tr>
                     <td>序号</td>
                     <td>Id</td>
                     <td>Name</td>
                     <td>Age</td>
                 </tr>
             </thead>
             <tbody>
                 <tr v-for="(item, index) in movie.Persons">
                     <td>{{ index + 1 }}</td>
                     <td><input class="form-control" :name="'Persons['+index+'].Id'"   v-model="item.Id" /></td>
                     <td><input class="form-control" :name="'Persons['+index+'].Name'" v-model="item.Name" /></td>
                     <td><input class="form-control" :name="'Persons['+index+'].Age'"  v-model="item.Age" /></td>
                 </tr>
             </tbody>
         </table>
         <button type="submit" class="btn btn-primary">提交</button>
     </form>

 </div>

 @section Scripts{
     <script>
         var vm = new Vue({
             el: '#app',
             data: {
                 movie: JSON.parse('@Html.Raw(Data)')
             },
             methods: {
                 NewRow() {
                     this.movie.Persons.push([]);
                 }
             }
         })
     </script>
 }

我们看看是怎样的界面

我们再去跟踪下前后端都发生了什么。

    

总结

vue的绑定功能真的是太方便了,不知道Razor有没有办法实现类似的功能。用jQuery又觉得麻烦了。

ASP .Net Core MVC如何利用vue提交包含List属性的form表单的更多相关文章

  1. .net c# 提交包含文件file 的form表单 获得文件的Stream流

    1.前台html代码 要写一个有id的form,可是不能有runat="server"属性.由于一个页面中,有这个属性的form表单仅仅能有一个. 再要有一个有name的ifram ...

  2. disabled属性对form表单提交的影响

    在form表单里,如果对input加入disabled="disabled"或disabled="true"等属性,form表单提交的时候,就不会传值到后台. ...

  3. 防止表单提交时刷新页面-阻止form表单的默认提交行为

    最近在写 ajax 提交的时候遇到一个问题,在执行 ajax 提交之后,浏览器页面自动刷新了,主要是没有 由于form 表单的默认提交行为.一下是几种阻止 form 表单默认提交行为的方式. 1.使用 ...

  4. Ajax提交数据后,清空form表单

    按钮不同,页面相同,还需要显示的数据不同,这里会由于页面的缓存问题,导致,每次点开这个页面显示的数据相同. 这不是我们想要的.这就需要清楚表单数据了. 如下: $('#myform')[0].rese ...

  5. vue iview modal弹出框 form表单验证

    一.ref="addApply" :model="addApply" :rules="ruleValidate"   不要忘记prop 二. ...

  6. ASP.NET Core MVC 源码学习:MVC 启动流程详解

    前言 在 上一篇 文章中,我们学习了 ASP.NET Core MVC 的路由模块,那么在本篇文章中,主要是对 ASP.NET Core MVC 启动流程的一个学习. ASP.NET Core 是新一 ...

  7. ASP.NET Core MVC 中的 Model 模型

    ASP.NET Core MVC 中的 Model 我们希望最终从 Student 数据库表中查询特定的学生详细信息并显示在网页上,如下所示. MVC 中的模型包含一组表示数据的类和管理该数据的逻辑. ...

  8. MVC中Form表单的提交

    概述 Web页面进行Form表单提交是数据提交的一种,在MVC中Form表单提交到服务器.服务端接受Form表单的方式有多种,如果一个Form有2个submit按钮,那后台如何判断是哪个按钮提交的数据 ...

  9. Jquery来对form表单提交(mvc方案)

    来自:http://www.cnblogs.com/lmfeng/archive/2011/06/18/2084325.html 我先说明一下,这是asp.net mvc 里面的用法, Jquery来 ...

随机推荐

  1. 原 在windows上创建文件名以“.”开头的文件

    在实际项目开发中,我们会经常遇到以”.”开头的配置文件.例如我们如果需要通过配置文件给npm更换源就需要更改.npmrc文件,然而还有很多友友还不清楚如何创建一个类似的文件,今天就和大家分享下这个小技 ...

  2. Tomcat 类加载器打破双亲委派模型

    我们分为4个部分来探讨: 1. 什么是类加载机制? 2. 什么是双亲委任模型? 3. 如何破坏双亲委任模型? 4. Tomcat 的类加载器是怎么设计的? 我想,在研究tomcat 类加载之前,我们复 ...

  3. 30分钟全方位了解阿里云Elasticsearch(附公开课完整视频)

    摘要: 阿里云Elasticsearch提供100%兼容开源Elasticsearch的功能,以及Security.Machine Learning.Graph.APM等商业功能,致力于数据分析.数据 ...

  4. 根据经纬度查询附近几公里的门店(<5)代表5公里

    select * from 表名 where status=1 and isopen =0 and jingyingtype=1 and waimai=1 and bstatus = 1 and (a ...

  5. 一种HTML table合并单元格的思路

    /** * 合并单元格 * @param table1 表格的ID * @param startRow 起始行 * @param col 合并的列号,对第几列进行合并(从0开始).如果传下来为0就是从 ...

  6. .NET ORM 开源项目 FreeSql 1.0 正式版发布

    一.简介 FreeSql 是 .NET 平台下的对象关系映射技术(O/RM),支持 .NetCore 2.1+ 或 .NetFramework 4.0+ 或 Xamarin. 从 0.0.1 发布,历 ...

  7. 聊一聊 MySQL 中的事务及其实现原理

    说到数据库,那就一定会聊到事务,事务也是面试中常问的问题,我们先来一个面试场景: 面试官:"事务的四大特性是什么?" 我:"ACID,即原子性(Atomicity).隔离 ...

  8. ES6学习之二

    本文的学习来自技术胖大神的教程:https://jspang.com/ 1扩展运算符和rest运算符 扩展运算符和rest运算符,它们都是…(三个点). 它们有很多相似之处,甚至很多时候不用特意去区分 ...

  9. c语言中自定义bool类型模板

    首先,c语言中没有bool类型,只有c++中有,所以需要自定义,即c中表示bool类型的方法: 1.模板1 typedef int bool; #define false 0 #define true ...

  10. 使用Rancher Server部署本地多节点K8S集群

    当我第一次开始我的Kubernetes之旅时,我一直在寻找一种设置本地部署环境的方式.很多人常常会使用minikube或microk8s,这两者非常适合新手在单节点集群环境下进行操作.但当我已经了解了 ...