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来 ...
随机推荐
- 【9307】&【a303】过河卒(NOIP2002)
Time Limit: 10 second Memory Limit: 2 MB 问题描述 如图,A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右. 同时在棋盘上的任一点有一个对方 ...
- H3C IPv6地址配置命令
- H3C 主机名与IP地址映射需求
- Linux 内核设备属性
sysfs 中的设备入口可有属性. 相关的结构是: struct device_attribute { struct attribute attr; ssize_t (*show)(struct de ...
- es6笔记 day2---函数默认参数、箭头函数、剩余参数
函数变化: 1.函数默认参数 2.函数参数默认是已经定义了,不能再使用let.const声明 3.扩展运算符.rest运算符 ...就是扩展运算符,它的作用就是把数组给展开 结合函数使用传参,也可以将 ...
- 数据预处理以及探索性分析(EDA)
1.根据某个列进行groupby,判断是否存在重复列. # Count the unique variables (if we got different weight values, # for e ...
- 第二阶段:2.商业需求分析及BRD:5.商业需求文档1
三大文档 FSD一般包含在PRD 1.BRD一般是去向决策层汇报 2.产品介绍的各项是可选的 不是必备的 产品线路图就是roodmap.团队一般是偏技术的团队. BRD案例. 痛点.定性的描述.不会非 ...
- docker 安装 redis5.0.3
一.拉取官方5.0.3镜像 [root@localhost ~]# docker pull redis:5.0.3 下载完成 [root@localhost ~]# docker pull redis ...
- 0029 定位:position(相对、绝对、固定、绝对定位盒子居中、z-index、绝对定位改变display属性)
目标 理解 能说出为什么要用定位 能说出定位的4种分类 能说出四种定位的各自特点 能说出我们为什么常用子绝父相布局 应用 能写出淘宝轮播图布局 1. CSS 布局的三种机制 网页布局的核心 -- 就是 ...
- 017 Ceph的集群管理_3
一.验证OSD 1.1 osd状态 运行状态有:up,in,out,down 正常状态的OSD为up且in 当OSD故障时,守护进程offline,在5分钟内,集群仍会将其标记为up和in,这是为了防 ...