asp.net-mvc - 复杂类型嵌套对象的绑定(bind)属性包含和排除属性

标签 asp.net-mvc asp.net-mvc-3 model-binding defaultmodelbinder

好吧,这很奇怪。我无法在 ASP.NET MVC 上将 BindAttributeIncludeExclude 属性与复杂类型嵌套对象一起使用。

这是我所做的:

型号:

public class FooViewModel {

    public Enquiry Enquiry { get; set; }
}

public class Enquiry {

    public int EnquiryId { get; set; }
    public string Latitude { get; set; }
}

HTTP POST 操作:

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

    return View(foo);
}

查看:

@using (Html.BeginForm()) {

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

    <input type="submit" value="push" />
}

根本不起作用。仅当我为 Enquiry 类定义 BindAttribute 时,才能实现此功能,如下所述:

How do I use the [Bind(Include="")] attribute on complex nested objects?

最佳答案

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

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

以及你的行动:

[ActionName("Foo"), HttpPost]
public ActionResult Foo_post(FooViewModel foo) 
{
    return View(foo);
}

这将仅在绑定(bind)中包含 EnquiryId,并将 Latitude 保留为空。

话虽如此,我不建议您使用 Bind 属性。我的建议是使用 View 模型。在这些 View 模型中,您只包含对该特定 View 有意义的属性。

因此只需重新调整您的 View 模型即可:

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

public class EnquiryViewModel 
{
    public int EnquiryId { get; set; }
}

给你。不再需要担心绑定(bind)。

关于asp.net-mvc - 复杂类型嵌套对象的绑定(bind)属性包含和排除属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8892550/

相关文章:

c# - 为什么我不能在我自己的类中访问 UmbracoHelper

asp.net-mvc - 覆盖默认身份表名称

c# - ASP.NET Web API : Multiple Custom Objects through Query String

asp.net-mvc-3 - asp.net mvc 3 中的元标记

ASP.NET MVC 模型绑定(bind) IList<> 参数

c# - 如果未找到公共(public)默认构造函数,ASP.NET Core 将使用非默认构造函数

asp.net-mvc - 将身份验证同时用于 MVC 页面和 Web API 页面?

c# - 如何使用不同类型的 ASP.NET MVC 访问 View 中的字段

asp.net-mvc - MVC 3 要求 System.Web 版本 2.0.0.0 (System.Web.UI.Controls) : Is this a compiler bug?

javascript - Socket.io 包未安装在窗口 7 Node.js 中