asp.net mvc 表单相关

时间:2020-12-13 17:43:35

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 > )
{
<span class="help-block">@ViewData.ModelState["Name"].Errors[].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方法中参数的名称不区分大小写