前言

遇到这个问题,是由于自己在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. 【9307】&【a303】过河卒(NOIP2002)

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 如图,A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右. 同时在棋盘上的任一点有一个对方 ...

  2. H3C IPv6地址配置命令

  3. H3C 主机名与IP地址映射需求

  4. Linux 内核设备属性

    sysfs 中的设备入口可有属性. 相关的结构是: struct device_attribute { struct attribute attr; ssize_t (*show)(struct de ...

  5. es6笔记 day2---函数默认参数、箭头函数、剩余参数

    函数变化: 1.函数默认参数 2.函数参数默认是已经定义了,不能再使用let.const声明 3.扩展运算符.rest运算符 ...就是扩展运算符,它的作用就是把数组给展开 结合函数使用传参,也可以将 ...

  6. 数据预处理以及探索性分析(EDA)

    1.根据某个列进行groupby,判断是否存在重复列. # Count the unique variables (if we got different weight values, # for e ...

  7. 第二阶段:2.商业需求分析及BRD:5.商业需求文档1

    三大文档 FSD一般包含在PRD 1.BRD一般是去向决策层汇报 2.产品介绍的各项是可选的 不是必备的 产品线路图就是roodmap.团队一般是偏技术的团队. BRD案例. 痛点.定性的描述.不会非 ...

  8. docker 安装 redis5.0.3

    一.拉取官方5.0.3镜像 [root@localhost ~]# docker pull redis:5.0.3 下载完成 [root@localhost ~]# docker pull redis ...

  9. 0029 定位:position(相对、绝对、固定、绝对定位盒子居中、z-index、绝对定位改变display属性)

    目标 理解 能说出为什么要用定位 能说出定位的4种分类 能说出四种定位的各自特点 能说出我们为什么常用子绝父相布局 应用 能写出淘宝轮播图布局 1. CSS 布局的三种机制 网页布局的核心 -- 就是 ...

  10. 017 Ceph的集群管理_3

    一.验证OSD 1.1 osd状态 运行状态有:up,in,out,down 正常状态的OSD为up且in 当OSD故障时,守护进程offline,在5分钟内,集群仍会将其标记为up和in,这是为了防 ...