[HttpPost] public ActionResult Create(FormCollection collection)VERSUS [HttpPost] public ActionResult Create(Dinner dinner)

xpo*_*ort 6 asp.net-mvc asp.net-mvc-2

在Scott Hanselman的书(第1章)中,他为我们提供了两个实现[HttpPost] for Create action方法的选项.

第一个依赖于TryUpdateModel来根据传入的表单字段更新模型对象.当传入的表单字段包含无效输入时,ModelState.IsValid将设置为false.

        [HttpPost]
        public ActionResult Create(FormCollection collection)
        {
            Dinner dinner = new Dinner();

            if (TryUpdateModel(dinner))
            {
                dinnerRepository.Add(dinner);

                dinnerRepository.Save();

                return RedirectToAction("Details", new { id = dinner.DinnerId });
            }
            else
                return View(dinner);

        }
Run Code Online (Sandbox Code Playgroud)

第二种方法是利用作为Create action方法arg传递的模型如下:

        [HttpPost]
        public ActionResult Create(Dinner dinner)
        {
            if (ModelState.IsValid)
            {
                dinnerRepository.Add(dinner);

                dinnerRepository.Save();

                return RedirectToAction("Details", new { id = dinner.DinnerId });
            }
            else
                return View(dinner);
        }
Run Code Online (Sandbox Code Playgroud)

哪一个更适合在生产中使用?

kay*_*zam 5

如果所有必需的数据都在Request.Form,路由数据或URL查询字符串中,那么您可以使用模型绑定,如第二个示例中所示.

模型绑定器创建您的晚餐对象,并通过匹配属性名称使用请求中的数据填充它.

您可以使用"白名单","黑名单",前缀和标记界面自定义绑定过程.只需确保您不会无意中绑定值 - 请参阅此链接.