11

好吧,这很奇怪。我不能在 ASP.NET MVC 上使用具有复杂类型嵌套对象BindAttribute的 'sInclude和属性。Exclude

这是我所做的:

模型:

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" />
}

根本不起作用。如果我按照此处所述定义BindAttributeforEnquiry类,我只能使这项工作:

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

4

2 回答 2

15

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

[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空。

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

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

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

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

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

于 2012-01-17T09:57:16.647 回答
0

恕我直言,有更好的方法来做到这一点。

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

IE

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 Include 字符串中以进行发布操作的查询,因此该操作不会接受结果中的新值询问。我建议将纬度禁用或不作为表单元素,以防止额外的发布数据。

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

附带说明一下,我不会将 bind 属性直接放在类上,因为它会导致其他问题,例如代码复制,并且不考虑您可能希望拥有不同绑定的某些场景。

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

于 2015-08-28T07:17:09.693 回答