具有复杂类型嵌套对象的bind属性include和exclude属性

tug*_*erk 11 asp.net-mvc defaultmodelbinder model-binding asp.net-mvc-3

好的,这很奇怪.我不能用BindAttributeIncludeExclude性质与ASP.NET MVC复杂类型嵌套对象.

这是我做的:

这是我的模特:

public class FooViewModel {

    public Enquiry Enquiry { get; set; }
}

public class Enquiry {

    public int EnquiryId { get; set; }
    public string Latitude { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

HTTP Post动作:

[ActionName("Foo"), HttpPost]
public ActionResult Foo_post(
    [Bind(Include = "Enquiry.EnquiryId")]
    FooViewModel foo) {

    return View(foo);
}
Run Code Online (Sandbox Code Playgroud)

视图:

@using (Html.BeginForm()) {

    @Html.TextBoxFor(m => m.Enquiry.EnquiryId)
    @Html.TextBoxFor(m => m.Enquiry.Latitude)

    <input type="submit" value="push" />
}
Run Code Online (Sandbox Code Playgroud)

根本不起作用.如果我按照此处的说明定义BindAttributefor Enquiry类,我可以只做这项工作:

如何在复杂的嵌套对象上使用[Bind(Include ="")]属性?

Dar*_*rov 15

是的,你可以让它像那样工作:

[Bind(Include = "EnquiryId")]
public class Enquiry 
{
    public int EnquiryId { get; set; }
    public string Latitude { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和你的行动:

[ActionName("Foo"), HttpPost]
public ActionResult Foo_post(FooViewModel foo) 
{
    return View(foo);
}
Run Code Online (Sandbox Code Playgroud)

这将仅包括EnquiryId绑定中的并保留Latitudenull.

这就是说,使用Bind属性不是我推荐你的东西.我的建议是使用视图模型.在这些视图模型中,您只包含对此特定视图有意义的属性.

所以,只需重新阅读您的视图模型:

public class FooViewModel 
{
    public EnquiryViewModel Enquiry { get; set; }
}

public class EnquiryViewModel 
{
    public int EnquiryId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

你去吧 不再需要担心绑定.

  • @tugberk,我对此的想法是在视图模型上定义验证逻辑.此验证逻辑并不总是与您的域模型上的验证逻辑相同.您在视图模型上定义的验证逻辑仅在给定视图的上下文中有效,而您域上的验证逻辑对整个应用程序有效. (4认同)
  • @tugberk,我真的不会去那条路.使用视图模型是解决这类问题的方法.而且不仅仅是那些问题.您应该始终在ASP.NET MVC应用程序中使用视图模型. (2认同)