Шаблонные помощники и списки выбора в модели представления не смешиваются: верно? - PullRequest
0 голосов
/ 21 сентября 2011

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

ViewModel:

public class InvoiceViewModel 
{
     [UIHint("SelectInvoiceType")]
     public int idInvoiceType { get; set; }

     /* snip */

     /* I'll use this in the view to generate a SelectList */
     public List<invoicetype> InvoiceTypes { get; set; }
}

Но тогда, когда мы доберемся до шаблона редактора, объект Model будет просто int, без знания модели представления:

SelectInvoiceType.cshtml

@model int
@{
  Layout = "~/Views/Shared/_EditorFormItem.cshtml";
  List<SelectListItem> selList = /* nothing to say here, really */;
}
@section DataContent {
   @Html.DropDownListFor(m => Model, selList, null)
}

Итак, если я что-то упустил, эти две "лучшие практики" - шаблонные помощники вида и строго типизированные данные списка в модели представления - просто нельзя использовать вместе. У вас есть , чтобы прибегнуть к вставке данных списка в ViewBag. Звук примерно так?

Извините, что звучу недоверчиво, но мне кажется, что я что-то упускаю.

1 Ответ

1 голос
/ 21 сентября 2011

Вы должны прибегнуть к заполнению данных списка в ViewBag. Звук примерно так?

Нет. Для меня начинка в ViewBag / ViewData не звучит правильно. Не следует использовать int в качестве типа модели для шаблона редактора, который должен генерировать выпадающий список. Раскрывающийся список состоит из двух свойств: скалярного типа, к которому привязывается выбранное значение, и коллекции, которая будет использоваться для генерации различных опций в этом ddl.

Так что более правильный путь будет следующим:

public class MyViewModel
{
    [UIHint("SelectInvoiceType")]
    public InvoiceTypesViewModel Invoice { get; set; }

    ... some other properties specific to the view
}

где InvoiceTypesViewModel - модель представления и не содержит ссылки на модели домена, такие как invoicetype в списке в вашем примере:

public class InvoiceTypesViewModel
{
     public int SelectedInvoiceType { get; set; }
     public SelectList InvoiceTypes { get; set; }
}

затем на вашем главном экране:

@model MyViewModel
...
@Html.EditorFor(x => x.Invoice)

и шаблон редактора:

@model InvoiceViewModel
@Html.DropDownListFor(m => m.SelectedInvoiceType, Model.InvoiceTypes)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...