MVC3 Razor модель переплета и унаследованные коллекции - PullRequest
6 голосов
/ 21 июня 2011

Я надеюсь, что здесь не пропущено что-то невероятно очевидное, но есть ли причина, по которой связыватель модели всегда испытывает проблемы с привязкой модели представления, которая наследуется из коллекции?

Допустим, я хочу показать постраничнуюсоставить список и отобразить поле со списком и добавить кнопку над ним (работа с простыми списками).Вовлеченные классы будут выглядеть так:

public class PagedList<T> : List<T>
{
    public int TotalCount { get; set; }
}

И тогда модель представления будет выглядеть так:

public class MyViewModel : PagedList<ConcreteModel>
{
    public IEnumerable<ChildModel> List { get; set; }
    public int? SelectedChildModelId { get; set; }
}

Итак, в представлении (Razor):

@model MyViewModel 
@using (Html.BeginForm())
{
    @Html.DropDownListFor(model => model.SelectedChildModelId, new SelectList(Model.List, "ChildModelId", "DisplayName"))
}

И действие контроллера HttpPost:

public ActionResult(MyViewModel viewModel)
{
    ...
}

Приведенное выше приведёт к тому, что viewModel в ActionResult будет нулевым.Есть ли логическое объяснение этому?Из того, что я могу сказать, это специфично только для просмотра моделей, которые наследуются из коллекций.

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

Я переработал модели представления, чтобы унаследованный тип коллекции имел свойства, и это устраняет проблему.Тем не менее, я все еще ломаю голову над тем, почему на него ломается переплет.Любые конструктивные мысли приветствуются.

Ответы [ 2 ]

1 голос
/ 05 декабря 2011

Чтобы ответить на мой собственный вопрос: все мои модели, которые имеют какое-либо отношение к коллекциям, больше не наследуют из общего списка или аналогичного, а вместо этого имеют свойство требуемого типа коллекции.Это работает намного лучше, потому что при рендеринге вы можете использовать

@Html.EditorFor(m => m.CollectionProperty)

и создать собственный редактор в Views / Shared / EditorTemplates для вложенного типа.Он также прекрасно работает с механизмом связывания моделей, поскольку все отдельные элементы коллекции получают индекс, и механизм связывания может автоматически связывать его при отправке.

Извлеченный урок: если вы планируете использовать модели в представлениях, не наследуйтеиз коллекции типов.

0 голосов
/ 14 июля 2011

Иногда привязка модели к коллекции работает лучше, если данные в записи формы отформатированы по-разному.

Я использую плагин под названием postify.

http://www.nickriggs.com/posts/post-complex-javascript-objects-to-asp-net-mvc-controllers/

...