Атрибут bind включает и исключает свойство со вложенными объектами сложного типа - PullRequest
10 голосов
/ 17 января 2012

Хорошо, это странно. Я не могу использовать свойства BindAttribute Include и Exculude со вложенными объектами сложного типа в 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" />
}

Не работает вообще. Могу ли я сделать эту работу, только если я определю BindAttribute для Enquiry класса, как указано здесь:

Как использовать атрибут [Bind (Include = "")] для сложных вложенных объектов?

Ответы [ 2 ]

15 голосов
/ 17 января 2012

Да, вы можете заставить его работать так:

[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 null.

Как говорится, использование атрибута Bind - это не то, что я бы порекомендовал вам.Моя рекомендация заключается в использовании моделей просмотра.Внутри этих моделей представлений вы включаете только те свойства, которые имеют смысл для этого конкретного представления.

Итак, просто перенастройте ваши модели представлений:

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

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

Вот и все.Больше не нужно беспокоиться о привязке.

1 голос
/ 28 августа 2015

ИМХО, есть лучший способ сделать это.

По сути, если у вас есть несколько моделей в модели представления, подпись контроллера поста будет содержать те же модели, в отличие от модели представления.

И.Е.

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

Имейте в виду, что эта форма будет по-прежнему отправлять Локатор обратно (так, как вы его настроили), однако, поскольку она не включена в строку «Привязать включить» для запроса о действии публикации, действие не примет новое значение в результате запроса. Я бы посоветовал отключить широту или не использовать элемент формы, чтобы предотвратить дополнительные данные публикации.

В любом другом сценарии вы можете использовать связывание просто отлично, но по какой-то причине ему не нравятся точечные обозначения для сложных моделей.

В качестве примечания: я бы не стал ставить атрибут bind непосредственно на класс, так как это может вызвать другие проблемы, такие как репликация кода, и не учитывать некоторые сценарии, в которых может потребоваться другая привязка.

(Я изменил имена переменных для большей ясности. Я также знаю, что ваш вопрос довольно устарел, однако при поиске ответа сам это первый случай, на который я наткнулся, прежде чем пытаться найти собственное решение и перейти к тому, который я написал Я надеюсь, что это может помочь другим людям, которые ищут решение той же проблемы.)

...