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



好吧,这很奇怪。我不能将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; }
}

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时,我才能实现这一点,如下所述:

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

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

[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);
}

这将在绑定中仅包括EnquiryId,并使Latitude为空。

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

因此,只需重新调整您的视图模型:

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

给你。不再需要担心绑定。

IMHO有更好的方法可以做到这一点。

本质上,如果视图模型中有多个模型,则后控制器的签名将包含与视图模型相反的相同模型。

public class FooViewModel {
    public Bar BarV { get; set; }
    public Enquiry EnquiryV { get; set; }
    public int ThisNumber { get; set; }
}
public class Bar {
    public int BarId { get; set; }
}
public class Enquiry {
    public int EnquiryId { get; set; }
    public string Latitude { get; set; }
}

控制器中的post操作看起来是这样的。

[ActionName("Foo"), HttpPost]
public ActionResult Foo_post(
    [Bind(Include = "EnquiryId")]
    Enquiry EnquiryV,
    [Bind(Include = "BarId"])]
    Bar BarV,
    int ThisNumber
{
    return View(new FooViewModel { Bar = BarV, Enquiry = EnquiryV, ThisNumber = ThisNumber });
}

一直以来,视图看起来仍然像这个

@using (Html.BeginForm()) {
    @Html.TextBoxFor(m => m.EnquiryV.EnquiryId)
    @Html.TextBoxFor(m => m.EnquiryV.Latitude)
    @Html.TextBoxFor(m => m.BarV.BarId)
    @Html.TextBoxFor(m => m.ThisNumber)
    <input type="submit" value="push" />
}

请记住,此表单仍然会返回Latitude(按照您设置的方式),但由于它不包括在发布操作的查询的绑定包含字符串中,因此该操作不会接受结果查询中的新值。我建议禁用或不将纬度作为表单元素,以防止出现额外的发布数据。

在任何其他场景中,您都可以很好地使用bind,但出于某种原因,它不喜欢复杂模型的点表示法。

附带说明一下,我不会直接将bind属性放在类上,因为它可能会导致代码复制等其他问题,并且不会考虑到您可能想要不同绑定的某些情况。

(为了更清楚起见,我修改了变量名。我也知道你的问题已经过时了,但在我自己寻找答案的过程中,这是我在尝试自己的解决方案并找到我发布的解决方案之前偶然发现的第一个问题。我希望它能帮助其他寻求相同问题解决方案的人。)

相关内容

  • 没有找到相关文章

最新更新