Ray*_*ond 4 asp.net naming-conventions model-binding asp.net-mvc-3
当存在子属性时,我遇到了默认模型绑定命名约定的问题.例如:
我有一个ViewModel,它看起来像这样:
public class UserViewModel
{
public User BusinessObject { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的User类有一个名为"NetworkLogin"的属性
我的视图具有以下内容:<%:Html.LabelFor(model => model.BusinessObject.NetworkLogin)%> <%:Html.TextBoxFor(model => model.BusinessObject.NetworkLogin)%>自动填充
我的控制器,我想做的,是
[HttpGet]
public ActionResult UserIndex(string networkLogin) { }
Run Code Online (Sandbox Code Playgroud)
问题:输入参数"networkLogin"始终为null.这是有道理的,因为html元素上的实际参数是name ="BusinessObject.NetworkLogin"和id ="BusinessObject_NetworkLogin".但是,我不知道我应该在我的action方法中使用什么参数名称.我尝试过"businessObject_NetworkLogin",它也不起作用.
但是,我有这个解决方法确实有效,但我不喜欢它.我将它添加到我的ViewModel:
public string NetworkLogin
{
get
{
if (BusinessObject == null)
BusinessObject = new User();
return BusinessObject.NetworkLogin;
}
set
{
if (BusinessObject == null)
BusinessObject = new User();
BusinessObject.NetworkLogin = value;
}
}
Run Code Online (Sandbox Code Playgroud)
而我的View页面现在却说明了这一点.<%:Html.TextBoxFor(model => model.NetworkLogin)%>
有人能告诉我默认模型绑定的正确命名约定是什么,这样我就不必采用上述解决方法了吗?
谢谢!
Dar*_*rov 11
指示前缀,以便模型绑定器知道BusinessObject.NetworkLogin查询字符串参数实际上指的networkLogin是您用作操作参数的内容
public ActionResult UserIndex(
[Bind(Prefix = "BusinessObject")] string networkLogin
)
{
...
}
Run Code Online (Sandbox Code Playgroud)
或重用您的视图模型:
public ActionResult UserIndex(UserViewModel model)
{
// TODO: use model.BusinessObject.NetworkLogin
// which is gonna be correctly bound here
...
}
Run Code Online (Sandbox Code Playgroud)
就您的解决方法而言,一旦您将我的两个建议之一付诸实践,您的视图模型属性应该看起来像这样:
public string NetworkLogin { get; set; }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2164 次 |
| 最近记录: |