在Asp.Net MVC
1.0编程中,我们经常遇见这样的场景,在新建一个对象时候,通过HtmlHelper
的方式在View模型中渲染Html控件,当填写完相关内容后,通过Form把需要新建的内容Post回View对应Controller的Action(例如:Create),指定的Action可以通过接受FormCollection参数、值参数或者某个类的实例参数(比如:Movie类),完成新建的操作。(主要指HtmlHelper.TextBox)

当我们通过传递FormCollection参数进行操作时,如果不使用UpdateModel方法,而利用ModelState.IsValid及ModelState.AddModelError实现错误校验提示等操作。这个时候,小心陷阱。
【注:本文章源代码通过VS2008创建】



1
、View模型中HtmlHelper绑定数据的顺序

开始前,让我们先了解下View模型中HtmlHelper绑定数据的顺序(主要指HtmlHelper.TextBox,其它还未研究)

我们知道,当View使用了HtmlHelper进行控件渲染的时候,HtmlHelper会通过键值尝试填充我们曾经填写过的数据,以防止用户从头填写。(比如:我们填写表单,提交,当出现验证错误的时候,我们希望表单刷新后曾经填写的内容依然存在,而不是全部要重新填写。而HtmlHelper就是这样帮助我们的)。HtmlHelper填充数据的顺序如下:

(1) 通过键值调用ModelState集合对应的System.Web.Mvc.ModelState实例的Value属性获取

(2) 通过HtmlHelper指定的值填充(Html.TextBox("Title",指定值))

(3) 通过键值获取ViewData内的对应数据

(4) 通过键值获取View中强类型的Model对象对应属性的数据

(5) 不填充

2、 传递FormCollection参数,不使用UpdateModel引起的异常

先看一个简单的例子源代码下载)。View通过Post传递FormCollection参数到对应Controller的Create
Action,Create
Action检验参数是否合法。如果合法,暂时什么都不做;如果不合法,则通过ModelState的AddModelError添加错误信息,并通过ModelState.
IsValid判断,如果无效,重新返回该View。

(1) View代码(没有任何特殊的地方,HtmlHelper使用Html.TextBox("Title")的方式):

复制代码

 (2) Controller中Create Action代码

对应的Create
Action代码如下,我们通过UpdateModel来进行Movie的填充,而是直接创建了一个Movie的实例(我直接在Controller的Action中验证参数,虽然我知道这样做不对,这里只是个例子。):

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection collection)
复制代码

相关文章:

  • 2022-12-23
  • 2021-06-26
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-09
  • 2021-05-31
猜你喜欢
  • 2021-10-30
  • 2022-12-23
  • 2021-06-02
  • 2021-11-04
  • 2022-12-23
  • 2022-12-23
  • 2021-11-16
相关资源
相似解决方案