Повторно используемый шаблон редактора с DropDownList для бизнес-объектов - PullRequest
5 голосов
/ 19 июля 2011

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

Для этого примера у меня есть два класса, как это: -

public class Person
{
  public int ID { get; set; }
  public string Name { get; set; }
  public Group Group { get; set; }
}

public class Group
{
  public int ID { get; set; }
  public string Name { get; set; }
}

У меня есть работающий контроллер / представление для человека.Представление имеет элемент управления DropDownListFor:

@model Person

...

@Html.DropDownListFor(o => o.Group.ID, (ViewData["groups"] as SelectList))

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

Вышеприведенное работает нормально ... в контроллере я беру значение из Group.ID в Person, возвращаемое из представления, ищу его и устанавливаю Person.Group на результат.Работает, но не идеально.

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

Я хотел бы сделать что-то подобное в шаблоне: -

@model Group

@Html.DropDownListFor(o => o.Group.ID, (ViewData["groups"] as SelectList))

Ииспользуйте его в таком виде: -

@Html.EditorFor(o => o.Group)

Однако вышеприведенное, похоже, не работает ... в приведенной выше строке EditorFor вставляются редакторы для всего класса (например, текстовое поле для Group.Description, а также) ... вместо вставки DropDownList с моими перечисленными группами

у меня есть вышеуказанный шаблон в файле с именем Group.cshtml в Views / Shared / EditorTemplates

Если это сработало, то всякий раз, когдаУ класса есть свойство типа Group, этот редактор DropDownList будет использоваться по умолчанию (или, по крайней мере, если он указан каким-либо атрибутом)

Заранее благодарим за любой предоставленный совет ...

1 Ответ

6 голосов
/ 23 августа 2011

Вы можете создать пользовательский элемент управления в раскрывающемся списке, чтобы справиться с этим.Под вашей общей папкой создайте папку с именем EditorTemplates и поместите туда свой пользовательский элемент управления.MVC, по соглашению, ищет в Shared / EditorTemplates любые шаблоны редактора.Вы можете переопределить, где он ищет шаблоны редактора, но я не буду вдаваться в подробности здесь.

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

быть примером реализации.

В папке Shared / EditorTemplates ваш пользовательский элемент управления (в данном случае _GroupsDropDown.cshtml) будет выглядеть так:

@model Group

@Html.DropDownListFor(o => o.ID, (ViewData["groups"] as SelectList))

Измените свойство Group в Person для добавленияатрибут UIHint выглядит следующим образом:

**[UIHint("_GroupsDropDown")]**
public Group Group { get; set; }

В вашем контроллере вам понадобится

ViewData["groups"] = new SelectList(<YourGroupList>, "ID", "Name");

Когда у вас есть вышеуказанный код, вы можете использовать синтаксис EditorFor по своему усмотрению.

Надеюсь, это поможет.

...