帮助.net中的ModelBinding复杂对象

时间:2011-02-08 21:16:56

标签: .net asp.net-mvc vb.net modelbinders

我有一个自定义的模型绑定器,用于处理我的accountRequest类。 该类由一些布尔值和一个UserViewModel组成。

UserViewModel由字符串组成,例如,名字,姓氏,地址。

最初我只是将UserViewModel作为动作参数传递,但我现在需要在accountRequest中打包UserViewModel。

但是,现在我的modelbinder不会将httpContext.Request中的字符串映射到AccountRequest内部的UserViewModel。所有的布尔都很好。

除了硬编码之外,还有一种简单的方法可以将他的数据映射到UserViewModel属性吗?

我试过这个,但我不喜欢它。 (简化的)

Dim accountRequest As New AccountRequest
Dim user As New UserViewModel

If Not String.IsNullOrEmpty(controllerContext.HttpContext.Request("Firstname")) Then
  user.FirstName = controllerContext.HttpContext.Request("Firstname")
End If

accountRequest.CurrentUser = user
Return accountRequest

显然,非常感谢任何帮助。提前谢谢!

1 个答案:

答案 0 :(得分:0)

抱歉 - 刚才意识到您的代码是VB,我已经用C#回答了

这可能是因为模型绑定器现在在ValueProviders中看起来modelname.property而不仅仅是property,之前,因为它是一个直接操作方法参数,它本来就是在寻找{ {1}}。

现在模型类型是另一个的成员,其属性名称将用作前缀,而我不相信您可以删除该要求(可以尝试property参数,但我认为这不会起作用。

这假设您没有自定义绑定每个属性,并且Bind(Prefix="")正在为您执行某些属性。

通过将查询字符串更改为DefaultModelBinder,您应该能够在不更改代码的情况下使其正常工作。如果您正在使用表单,那么您应该考虑使用?modelname.property=[value]扩展方法 - 因为它负责模型命名(只要您的ViewModel成员名称和输入模型名称一致)。但是作为查询字符串的一个例子:

Html.EditorFor

obj.Nested.StringProperty值可以用public class MyObject{ public string StringValue { get; set; } } public class MyObjectOuter{ public MyObject Nested { get; set; } } public ActionResult Index(MyObjectOuter obj); 填充,因为/Index?Nested.StringValue=hello%20world前缀无论如何都是隐含的。

如果你不喜欢这个,你有几个选择:

1)更改方法的签名以采用两个参数:

obj

然后在正文中,您立即将public ActionResult Index(MyObjectOuter outer, MyObject nested) 复制到nested属性。这有点哈哈 - 但它会起作用。

2)手动强制类属性的绑定使用obj.Nested中的非前缀值(但是您将模型类型限制为仅适用于某些类型的请求 - 这不是完全灵活)。

3)或者,正如我之前所说,如果这些属性是从Http表单绑定的,请使用ValueProviders生成标记 - 它会自动生成具有正确名称的输入,只要它们不是从输入 - >输出更改。