2011-06-07 96 views
4

我在遇到子属性时遇到了默认的模型绑定命名约定。例如:MVC模型绑定命名约定的子对象?

我有一个视图模型看起来是这样的:

public class UserViewModel 
{ 
    public User BusinessObject { get; set; } 
} 

我的User类有一个名为 “NetworkLogin”

我的视图具有这样的特性: <%: Html.LabelFor(model => model.BusinessObject.NetworkLogin)%> <%:Html.TextBoxFor(model => model.BusinessObject.NetworkLogin)%> 自动填充

而且我的控制,我想干什么,是

[HttpGet] 
    public ActionResult UserIndex(string networkLogin) { } 

问题: 输入参数“networkLogin”总是空。这是有道理的,因为html元素上的实际参数是name =“BusinessObject.NetworkLogin”和id =“BusinessObject_NetworkLogin”。但是,我不知道在我的操作方法中应该使用什么参数名称。我试过“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; 
     } 
    } 

而我的查看页面现在说这个。 <%:Html.TextBoxFor(model => model.NetworkLogin)%>

有人能告诉我默认的模型绑定是什么适当的命名约定,所以我不必采用上述解决方法?

谢谢!

回答

11

指明前缀,以便模型绑定都知道,BusinessObject.NetworkLogin查询字符串参数实际上是指networkLogin这是你作为行动参数

public ActionResult UserIndex(
    [Bind(Prefix = "BusinessObject")] string networkLogin 
) 
{ 
    ... 
} 

用什么或重用您的视图模型:

public ActionResult UserIndex(UserViewModel model) 
{ 
    // TODO: use model.BusinessObject.NetworkLogin 
    // which is gonna be correctly bound here 
    ... 
} 

就你的解决方法而言,一旦你将我的两个建议中的一个付诸行动,你的视图模型属性应该看起来像这样:

public string NetworkLogin { get; set; } 
+0

这看起来应该可以工作,但我决定使用一些ajax调用,所以我不愿意让我的项目准备好尝试以上。 – Raymond 2011-06-09 21:58:37

+4

Darin的+1看起来像一个很好的答案。雷蒙德,你至少可以做的就是在旧版本上试试这个。 – 2011-08-03 11:53:51