带有强类型HTML帮助程序的POST上的MV MVC2模型绑定问题

Bra*_*ton 3 c# attributes model-binding asp.net-mvc-2-validation asp.net-mvc-2

所以我正在考虑从MVC 1.0转向MVC 2.0 RTM.我想开始遵循的一个约定是使用强类型HTML帮助程序来生成像文本框这样的控件.

但是,看起来它不会是一个简单的跳跃.我尝试迁移我的第一个表单,替换这样的行:

<%= Html.TextBox("FirstName", Model.Data.FirstName, new {maxlength = 30}) %>
Run Code Online (Sandbox Code Playgroud)

...对于这样的行:

<%= Html.TextBoxFor(x => x.Data.FirstName, new {maxlength = 30}) %>
Run Code Online (Sandbox Code Playgroud)

以前,这将使用以下方法签名映射到POST上的相应视图模型:

[HttpPost]
public ActionResult Registration(AccountViewInfo viewInfo)
Run Code Online (Sandbox Code Playgroud)

相反,它当前返回一个空对象.我认为断开连接是因为我们将视图模型传递给一个更大的聚合对象,该对象具有一些页面元数据和其他有趣的东西(因此x.Data.FirstName而不是x.FirstName).

所以我的问题是:使用强类型帮助器的最佳方法是什么,同时仍允许MVC框架将表单集合适当地转换为我的视图模型,就像在原始行中一样?有没有办法在不更改我们传递给视图的聚合类型的情况下执行此操作?

谢谢!

更新:所以绑定属性运行良好,但我不喜欢我必须将其应用于基本上每个发布的视图模型.我最终更改了继承层次结构,以便所有视图模型都从包含页面内容和其他元数据的基类继承,而不是作为名为的聚合属性Data.

Lev*_*evi 5

public ActionResult Registration([Bind(Prefix = "data")] AccountViewInfo viewInfo);
Run Code Online (Sandbox Code Playgroud)

这告诉绑定器它应该期望所有值都以数据开头,因此它将查找data.FirstName等.

  • 将FirstName属性添加到Model本身,因此您将使用x => x.FirstName而不是x => x.Data.FirstName进行绑定. (2认同)