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来 ...
随机推荐
- P1094 百钱白鸡
题目描述 公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买100只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱. 输入格式 无. 输出格式 输出所有 ...
- es6—变量的解构赋值
数组的解构赋值 ]]]]]]] = []}} = {}} = {}})]: first]: last} = arr} = {}) {}))}))}) {}))}))].]]]])})] }}} = { ...
- P1022 绵羊排序
题目描述 聪聪想要给他家农场里的 \(n\) 只绵羊按照品质从高到低进行排序. 农场里的 \(n\) 只绵羊编号从 \(1\) 到 \(n\) ,第 \(i\) 只绵羊的体重为 \(w_i\) ,高度 ...
- Spring Boot Admin-应用健康监控后台管理
Spring Boot Admin 用于监控基于 Spring Boot 的应用,它是在 Spring Boot Actuator 的基础上提供简洁的可视化 WEB UI. 1. 什么是Spring ...
- linux 快速和慢速处理
老版本的 Linux 内核尽了很大努力来区分"快速"和"慢速"中断. 快速中断是那些能够很 快处理的, 而处理慢速中断要特别地长一些. 慢速中断可能十分苛求处理 ...
- 2019-5-31-SharpDx-进入全屏模式
title author date CreateTime categories SharpDx 进入全屏模式 lindexi 2019-5-31 9:5:36 +0800 2019-5-30 20:1 ...
- How to use code to exit the application in UWP
I will tell you how to exit the application in UWP by the code. We can call some static method to he ...
- 浮点数NaN和INF(#IND, #INF)
NaN&INF定义在一些情况会出现无效的浮点数,例如除0,例如负数求平方根等,像这类情况,获取到的浮点数的值是无效的. NaN 即 Not a Number 非数字 INF ...
- DRF框架中的异常处理程序
目录 DRF框架中自定义异常处理 一.自定义异常的原因 二.如何设置处理异常的程序 DRF框架中自定义异常处理 一.自定义异常的原因 在Django和DRF框架中都封装了很多的处理异常的程序,可以处理 ...
- SpringJDBC的使用(转载)
转载自 https://www.yiibai.com/spring/maven-spring-jdbc-example.html 工具: eclipse4.7.2及mysql-8.0.13 项目最 ...