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方法中参数的名称不区分大小写

posted on 2016-12-14 20:39  四芯线  阅读(127)  评论(0编辑  收藏  举报