asp.net mvc 表单相关
1. <form action="/controller/action" method="post">
...
</form>
*action 属性指定表单要提交到的网页地址
*method 属性指定表单提交时使用的方法(如: get , post)
2. 表单提交按钮可以使用<input type="submit" value="Submit">或<button type="submit">Submit</button>
*推荐使用<button>标签
3. MVC 中的 action 可以使用 [HttpGet] 或 [HttpPost] 特性来限制 action 只接受get请求或post请求
*如果 action 没有添加 [HttpGet] 或 [HttpPost] 特性,则两种方式的请求都接受
4. 在视图中获取模型状态对象,使用 ViewData.ModelState
例:获取模型验证的错误信息并显示
@if (ViewData.ModelState["Name"] != null && ViewData.ModelState["Name"].Errors.Count > 0) { <span class="help-block">@ViewData.ModelState["Name"].Errors[0].ErrorMessage</span> }
5. 表单隐藏字段
<input type="hidden" name="name" value="value" />
6. 注意表单重复提交问题,当用户发生多次点击提交按钮,刷新页面,后退页面后再次点击提交等操作时会重复提交表单。
*可在客户端或服务端等多个位置进行检测以防止重复提交,比如在服务端使用guid值标识表单
7. 注意CSRF(跨站请求伪造)攻击
*在asp.net mvc中提供了 ValidateAntiForgeryToken 特性和 @Html.AntiForgeryToken() 辅助方法
8. 注意过多提交问题,模型绑定时如果没有加以限制,将会在http请求中搜索并绑定所有的模型属性,当用户恶意提交了没有在表单中使用的属性时也会被绑定
*使用 [Bind] 特性限制要绑定的属性
例:使用 [Bind] 特性的 Include 属性设置绑定白名单,限制只有名单内的模型属性才会被绑定(多个属性名称之间使用逗号分隔)
[HttpPost] public ActionResult AddModel([Bind(Include = "Name")]Model model) { if (ModelState.IsValid) { return RedirectToAction("Action"); } return View(model); }
9. http请求中的参数的名称与Action方法中参数的名称不区分大小写