@model AspNetMvc.QuickStart.Models.Student @{ ViewBag.Title = "Create"; } Create @using (Html.BeginForm()) { @Html.AntiForgeryToken() Student @Html.ValidationSummary(true, "", new { @class = "text-danger" }) @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" }) @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" }) @* 省略 Gender Major EntranceDate *@ } @Html.ActionLink("Back to List", "Index") @section Scripts { @Scripts.Render("~/bundles/jqueryval") }
首先定义了视图中使用的模型类型是Student,这样LabelFor强类型辅助方法就可以从模型元数据中获取需要显示的文本。
页面打开时,由于并未传入任何模型对象,所以Model为空对象,如下所示:
所以页面上默认的输入框都是空的,截图中是作者输入值后的效果。
Html.BeginForm()会在页面上生成一个form标签,默认的提交地址还是当前页面(action=/Students/Create),默认的请求方法是post,如下所示:
因此,点击[Create]按钮时,会发出一个POST请求到后台,对应于Students控制器的Create方法。
保存数据与模型绑定下面我们来看下拥有[HttpPost]元数据的Create方法:
[HttpPost] [ValidateAntiForgeryToken] )] Student student) { if (ModelState.IsValid) { db.Students.Add(student); db.SaveChanges(); ); } return View(student); }
这里面有两个安全措施:
1. ValidateAntiForgeryToken:用来阻止CSRF(跨站请求伪造)。
2. Bind:用来阻止Over-Posting(过多提交攻击)。
这两个安全手段我们会在以后的文章中详细介绍,这里就先略过。
我们先看下本次请求的POST参数:
但是Create方法中只有一个Student对象参数,是不是很神奇,其实这是一个重要的概念模型绑定。
如果在WebForms中,我们可以会写一堆代码来从Request.Form中获取参数,并重建Student对象,类似如下代码:
Student student = new Student(); student.Name = Request.Form[]; student.Gender = Convert.ToInt32(Request.Form[]); ....
在MVC中,这一过程是自动完成,简单来说这就是模型绑定。
但是实际的模型绑定过程,不仅在请求的表单数据中查找,还会在路由参数,URL查询字符串,以及Cookie中查找。
如果模型绑定失败(比如模型参数不符合验证规则),则ModelState.IsValid就为false,这时会直接返回页面内容,此时模型对象student中保存的是用户输入的值,前端也会有错误提示,这个过程我们会在下一篇文章中讲解。
如果模型绑定成功,则保存新增数据,然后通过RedirectToAction来重定向到表格页面:
小结
这篇文章首先介绍了VS2015下MVC项目的创建过程;然后简要概述页面执行的流程,从路由引擎到控制器,再由控制器到视图,最后由视图返回到浏览器,而模型是作为控制器传入视图的参数,这样清晰明了;最后使用VS提供的模板,创建了一个带CRUD操作的数据访问实例。