前言

遇到这个问题,是由于自己在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常用命令行命令

    https://blog.csdn.net/qq_32451373/article/details/77743869 打开"运行"对话框(Win+R),输入cmd,打开控制台命令窗 ...

  2. H3C 802.1X典型配置举例

  3. 原生js 通用事件绑定

    /*原文地址:http://ejohn.org/blog/flexible-javascript-events/*/ http://blog.csdn.net/qi1271199790/article ...

  4. linux包之dracut

    这是一个工具类,不是一个后台服务类 centos7.2-minimal就下面三个包 [root@1st-kvm ~]# rpm -qa|grep dracutdracut-config-rescue- ...

  5. Java面向对象程序设计第7章1-8

    Java面向对象程序设计第7章1-8 1."程序中凡是可能出现异常的地方必须进行捕获或拋出",这句话对吗? 不对. 异常分两类,runtime异常和非runtime异常. runt ...

  6. 学习python资料

    资料链接:https://www.cnblogs.com/wupeiqi/articles/5433893.html

  7. Github安装和使用(超级详细)

    Github (原创:黑小子-余) 小编我是一名Git新手,然后花三天时间通过查找网上资料,了解Git的简单使用.本次我就实战操作git安装.github仓库创建.上传代码到github上.从gith ...

  8. 使用Miniconda安装Scrapy遇到的坑

    最近在看小甲鱼的书,学习学习爬虫,其中有一块是通过Miniconda3安装Scrapy,结果却遇到了下面的错误:fatal error in launcher:unable to create pro ...

  9. hexo+next 详细搭建

    安装node node下载地址:http://nodejs.cn/download/ 具体安装方法,这里不做详写 安装完成可以通过node -v 查看安装是否生效和node的版本 我这里使用的是v10 ...

  10. JavaScript之DOM操作,事件操作,节点操作

    1,DOM操作 1.1  概念 所谓DOM,全称Document Object Model 文档对象模型,DOM是W3C(World Wide Web Consortuum )标准,同时也定义了访问诸 ...