我有一个自定义的模型绑定器,用于处理我的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
显然,非常感谢任何帮助。提前谢谢!
答案 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
生成标记 - 它会自动生成具有正确名称的输入,只要它们不是从输入 - >输出更改。