前言

遇到这个问题,是由于自己在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. .net连接数据库

    /* 连接数据库步骤-- 1.创建连接字符串 data source = ... 计算机名称 initial catalog = ... 数据库名称 integrated security = tru ...

  2. JAVA JVM记录

    串行处理器: 适用情况:数据量比较小(100M左右):单处理器下并且对响应时间无要求的应用. 缺点:只能用于小型应用 并行处理器: 适用情况:“对吞吐量有高要求”,多CPU.对应用响应时间无要求的中. ...

  3. 服务端CURL请求

    服务端与服务端之间,也存在接口编程. 比如我们网站服务端,需要发送短信.发送邮件.查询快递等,都需要调用第三方平台的接口. 1.php中发送请求 ①file_get_contents函数 :传递完整的 ...

  4. oracle解除被锁定的表的状态

      select b.owner,b.object_name,a.session_id,a.locked_mode,c.serial#,c.sid||','||c.serial# from v$loc ...

  5. pandas小程序应用-实验

    背景:来自于日常工作,针对医院行政人员统计日常门诊信息,手工统计繁琐.容易出错的问题,结合实际特点,采用python对数据进行自动统计. 具体步骤如下: 1.引入python工具包. import p ...

  6. UTF-8、UTF-16、UTF-32编码的相互转换(不使用现成的函数)

    最近在考虑写一个可以跨平台的通用字符串类,首先需要搞定的就是编码转换问题. vs默认保存代码文件,使用的是本地code(中文即GBK,日文即Shift-JIS),也可以使用带BOM的UTF-8.gcc ...

  7. QT中加载动态链接库

    一.添加第三方的头文件 这个问题再简单不过了,不过我还是要说下. 首先,添加头文件  #include "ControlCAN.h" 然后,再将这个头文件放到工程的目录下,就OK了 ...

  8. 第二阶段:4.商业需求文档MRD:5.PRD-原型图

    页面原型图!

  9. 深入谷歌和甲骨文旷日持久的版权战争,趣味科普当前最火的编程语言JAVA的前世今生

    这篇文章是我在B站上投稿的一个科普java的视频文案,内容如标题,感兴趣的码农朋友可以移步观看https://www.bilibili.com/video/av81171108/ 在过去短短几十年间, ...

  10. Kubernetes从私有镜像仓库中拉取镜像

    当我们尝试从私有仓库中拉取镜像时,可能会收到这样提示:requested access to the resource is denied Error response from daemon: pu ...