2012-02-09 4 views
1

Я пытаюсь сократить использование кода. У меня есть string.cshtml и multiline.cshtml EditorTemplate для строк и текстовых полей. Они достаточно общие, чтобы просто использовать один раз. Например, это мой string.cshtml (без посторонней HTML):Generic EditorTemplate для DropDownList?

@Html.Label(ViewData.ModelMetadata.DisplayName) 

@Html.TextBox("", 
ViewData.TemplateInfo.FormattedModelValue, 
new { placeholder = ViewData.ModelMetadata.Watermark }) 

@if (ViewData.ModelMetadata.IsRequired) 
    { 
     @:<span class="required"></span> 
    } 
@Html.ValidationMessage("") 

Это в значительной степени то же самое для моего текстового поля. То, что я надеюсь сделать, это создать аналогичный EditorTemplate для моих dropdownlists. Что-то вроде:

... 
@Html.DropDown("", ......) 
.... 

Я попытался изменения с помощью кода в скобках для текстового поля выше и я попытался выяснить, на основании моего фактического DropDownList, какой код идет там. Мне не повезло.

Таким образом, я мог бы использовать либо [UIHint("TemplateName")], либо сделать что-то вроде @Html.EditorFor(m => m.MyProperty, "TemplateName"), чтобы вызвать его.

Вот что мой DropDownList выглядит в обычном виде:

... 
@Html.DropDownListFor 
(m => m.MyProperty, 
new SelectList(Model.MyPropertyList, 
"Value", "Text")) 
... 

Приведенный выше код работает в моих взглядах мелкий, и если нет никакого решения, я просто буду повторно использовать его. Тем не менее, у меня есть другие dropdownlists, которые я хочу создать, и я хочу поместить все dropdownlists в шаблоны для повторного использования. Я подумал, что было бы лучше иметь один dropdownlist EditorTemplate, чтобы управлять ими всеми. ;)

ответ

3

Проблема заключается в том, что для создания выпадающего списка вам нужно 2 свойства: скалярное свойство (MyProperty в вашем примере) для привязки выбранного значения и свойства коллекции (MyPropertyList в вашем примере). Шаблоны редакторов подходят для отдельных свойств. Поэтому, если вы не определите какой-то общий класс, который будет содержать эти 2 свойства для представления выпадающего списка, а затем определите шаблон редактора для этого универсального класса, ваш текущий код должен работать и отлично.

+0

Спасибо за большое объяснение. Я просто поставлю свой рабочий код в шаблон с другими элементами управления формы для повторного использования. Эти шаблоны уже используют '@ Html.EditorFor()', которые используют String.cshtml и MultilineText.cshtml EditorTemplates. – REMESQ

0

Не самое лучшее решением, но

@Html.DropDownList(ViewData.TemplateInfo.FormattedModelValue.ToString(), 
new SelectList(ViewData["GenericSelectionList"] as IList), 
ViewData["Id"].ToString(), ViewData["Name"].ToString()) 

, а затем на ваш родительский взгляде (или где-либо его следует называть)

@html.EditorFor(x=> Model.ScalarProperty, new {GenericSelectionList =YourList, Id ="IdProperty", Name ="NameProperty"}) 
Смежные вопросы