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来 ...
随机推荐
- httpclient: Content-Length header already present问题
现象:用httpclient发送http请求时,客户端返回: org.apache.http.client.ClientProtocolException at org.apache.http.imp ...
- Spring Cloud探路(一) Erueka服务器的建立
组件名:Netflix Eureka 作用:支撑微服务的自注册.自发现,提供负载均衡能力 开发环境使用IDEA 1.新建Eureka Server,新建maven项目,配置pom.xml <p ...
- JavaMail转发邮件
最近要做一个邮件转发功能,看了好多blog,都是接受邮件,再解析邮件内容,再组装成新的邮件发出! 我按照这个不够,不错!邮件发出去了.但是好麻烦啊,接受邮件是个Message,发送邮件也是个Messa ...
- angular 全局常用指令
1.全局支持 enter快捷键触发事件 // 全局指令 app.directive('ngEnter', ['$window',"$timeout", ($window,$time ...
- H3C DHCP中继基本配置
- node第一个参数必须是err
Node.js 约定回调函数第一个参数必须是错误对象err: 问题:Node.js约定回调函数第一个参数必须是错误对象err,如果没有错误该参数就是null 原因:异步执行分成两段,在两段之间抛出异常 ...
- 消息驱动Bean
消息驱动bean是专门用来处理基于消息请求的组件.MDB负责处理消息,而EJB容器则负责处理服务(事务,安全,并发,消息确认等),使Bean的开发者集中精力在处理消息的业务逻辑上. 消息驱动Bean. ...
- A non well formed numeric value encountered
在从数据库获取时间戳数据的时候返回的结果是varchar类型 然后在用date("Y-m-d H:i:s", 时间戳)的时候会报错A non well formed numeric ...
- Service Mesh服务网格清单
Service Mesh服务网格清单 Istio Istio官网 Istio中文官网 Istio开源 无需太多介绍Service Mesh明日之星,扛把子,截止2019.11还有太多问题没解决 复杂性 ...
- 《提升能力,涨薪可待》-Java并发之AQS全面详解
欢迎关注公众号[Ccww笔记],原创技术文章第一时间推出 一.AQS是什么?有什么用? AQS全称AbstractQueuedSynchronizer,即抽象的队列同步器,是一种用来构建锁和同步器的框 ...