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来 ...
随机推荐
- .net连接数据库
/* 连接数据库步骤-- 1.创建连接字符串 data source = ... 计算机名称 initial catalog = ... 数据库名称 integrated security = tru ...
- JAVA JVM记录
串行处理器: 适用情况:数据量比较小(100M左右):单处理器下并且对响应时间无要求的应用. 缺点:只能用于小型应用 并行处理器: 适用情况:“对吞吐量有高要求”,多CPU.对应用响应时间无要求的中. ...
- 服务端CURL请求
服务端与服务端之间,也存在接口编程. 比如我们网站服务端,需要发送短信.发送邮件.查询快递等,都需要调用第三方平台的接口. 1.php中发送请求 ①file_get_contents函数 :传递完整的 ...
- oracle解除被锁定的表的状态
select b.owner,b.object_name,a.session_id,a.locked_mode,c.serial#,c.sid||','||c.serial# from v$loc ...
- pandas小程序应用-实验
背景:来自于日常工作,针对医院行政人员统计日常门诊信息,手工统计繁琐.容易出错的问题,结合实际特点,采用python对数据进行自动统计. 具体步骤如下: 1.引入python工具包. import p ...
- UTF-8、UTF-16、UTF-32编码的相互转换(不使用现成的函数)
最近在考虑写一个可以跨平台的通用字符串类,首先需要搞定的就是编码转换问题. vs默认保存代码文件,使用的是本地code(中文即GBK,日文即Shift-JIS),也可以使用带BOM的UTF-8.gcc ...
- QT中加载动态链接库
一.添加第三方的头文件 这个问题再简单不过了,不过我还是要说下. 首先,添加头文件 #include "ControlCAN.h" 然后,再将这个头文件放到工程的目录下,就OK了 ...
- 第二阶段:4.商业需求文档MRD:5.PRD-原型图
页面原型图!
- 深入谷歌和甲骨文旷日持久的版权战争,趣味科普当前最火的编程语言JAVA的前世今生
这篇文章是我在B站上投稿的一个科普java的视频文案,内容如标题,感兴趣的码农朋友可以移步观看https://www.bilibili.com/video/av81171108/ 在过去短短几十年间, ...
- Kubernetes从私有镜像仓库中拉取镜像
当我们尝试从私有仓库中拉取镜像时,可能会收到这样提示:requested access to the resource is denied Error response from daemon: pu ...