ASP .Net Core MVC如何利用vue提交包含List属性的form表单
前言
遇到这个问题,是由于自己在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表单的更多相关文章
- .net c# 提交包含文件file 的form表单 获得文件的Stream流
1.前台html代码 要写一个有id的form,可是不能有runat="server"属性.由于一个页面中,有这个属性的form表单仅仅能有一个. 再要有一个有name的ifram ...
- disabled属性对form表单提交的影响
在form表单里,如果对input加入disabled="disabled"或disabled="true"等属性,form表单提交的时候,就不会传值到后台. ...
- 防止表单提交时刷新页面-阻止form表单的默认提交行为
最近在写 ajax 提交的时候遇到一个问题,在执行 ajax 提交之后,浏览器页面自动刷新了,主要是没有 由于form 表单的默认提交行为.一下是几种阻止 form 表单默认提交行为的方式. 1.使用 ...
- Ajax提交数据后,清空form表单
按钮不同,页面相同,还需要显示的数据不同,这里会由于页面的缓存问题,导致,每次点开这个页面显示的数据相同. 这不是我们想要的.这就需要清楚表单数据了. 如下: $('#myform')[0].rese ...
- vue iview modal弹出框 form表单验证
一.ref="addApply" :model="addApply" :rules="ruleValidate" 不要忘记prop 二. ...
- ASP.NET Core MVC 源码学习:MVC 启动流程详解
前言 在 上一篇 文章中,我们学习了 ASP.NET Core MVC 的路由模块,那么在本篇文章中,主要是对 ASP.NET Core MVC 启动流程的一个学习. ASP.NET Core 是新一 ...
- ASP.NET Core MVC 中的 Model 模型
ASP.NET Core MVC 中的 Model 我们希望最终从 Student 数据库表中查询特定的学生详细信息并显示在网页上,如下所示. MVC 中的模型包含一组表示数据的类和管理该数据的逻辑. ...
- MVC中Form表单的提交
概述 Web页面进行Form表单提交是数据提交的一种,在MVC中Form表单提交到服务器.服务端接受Form表单的方式有多种,如果一个Form有2个submit按钮,那后台如何判断是哪个按钮提交的数据 ...
- Jquery来对form表单提交(mvc方案)
来自:http://www.cnblogs.com/lmfeng/archive/2011/06/18/2084325.html 我先说明一下,这是asp.net mvc 里面的用法, Jquery来 ...
随机推荐
- windows常用命令行命令
https://blog.csdn.net/qq_32451373/article/details/77743869 打开"运行"对话框(Win+R),输入cmd,打开控制台命令窗 ...
- H3C 802.1X典型配置举例
- 原生js 通用事件绑定
/*原文地址:http://ejohn.org/blog/flexible-javascript-events/*/ http://blog.csdn.net/qi1271199790/article ...
- linux包之dracut
这是一个工具类,不是一个后台服务类 centos7.2-minimal就下面三个包 [root@1st-kvm ~]# rpm -qa|grep dracutdracut-config-rescue- ...
- Java面向对象程序设计第7章1-8
Java面向对象程序设计第7章1-8 1."程序中凡是可能出现异常的地方必须进行捕获或拋出",这句话对吗? 不对. 异常分两类,runtime异常和非runtime异常. runt ...
- 学习python资料
资料链接:https://www.cnblogs.com/wupeiqi/articles/5433893.html
- Github安装和使用(超级详细)
Github (原创:黑小子-余) 小编我是一名Git新手,然后花三天时间通过查找网上资料,了解Git的简单使用.本次我就实战操作git安装.github仓库创建.上传代码到github上.从gith ...
- 使用Miniconda安装Scrapy遇到的坑
最近在看小甲鱼的书,学习学习爬虫,其中有一块是通过Miniconda3安装Scrapy,结果却遇到了下面的错误:fatal error in launcher:unable to create pro ...
- hexo+next 详细搭建
安装node node下载地址:http://nodejs.cn/download/ 具体安装方法,这里不做详写 安装完成可以通过node -v 查看安装是否生效和node的版本 我这里使用的是v10 ...
- JavaScript之DOM操作,事件操作,节点操作
1,DOM操作 1.1 概念 所谓DOM,全称Document Object Model 文档对象模型,DOM是W3C(World Wide Web Consortuum )标准,同时也定义了访问诸 ...