Преобразование HTML.EditorFor в раскрывающемся списке (html.dropdownfor?)

В настоящее время я использую Html.Элемент управления EditorFor на странице просмотра "создать" по умолчанию.

 <%: Html.EditorFor(model => model.IsActive) %> 

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

  1. Если в раскрывающемся списке требуется только 2/3 значений..есть ли быстрый способ явно заполнить 2 или 3 значения?

  2. Если список большой и должен исходить из sql-запроса, как это сделать это?

заранее спасибо за помощь.

1 ответов


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

таким образом, вы можете определить модель представления:

public class DropDownListViewModel
{
    public string SelectedValue { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }
}

и тогда на вашей модели основного вида есть свойство этого типа:

public DropDownListViewModel Foo { get; set; }

теперь у вас может быть пользовательский шаблон редактора для этого типа (~/Views/Shared/EditorTemplates/DropDownListViewModel.ascx):

<%@ Control 
    Language="C#" Inherits="System.Web.Mvc.ViewUserControl<DropDownListViewModel>" 
%>
<%= Html.DropDownListFor(x => x.SelectedValue, Model.Items) %>

и затем в вашем главном представлении:

<%= Html.EditorFor(x => x.Foo) %> 

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

С другой стороны, если бы вы знали значения заранее, вы могли бы жестко закодировать их в шаблоне редактора (~/Views/Shared/EditorTemplates/YesNoDropDown.ascx):

<%= Html.DropDownList(
    "", 
    new SelectList(
        new[] 
        { 
            new { Value = "true", Text = "Yes" },
            new { Value = "false", Text = "No" },
        }, 
        "Value", 
        "Text",
        Model
    )
) %>

и затем:

<%= Html.EditorFor(x => x.IsActive, "YesNoDropDown") %> 

или украшения Свойство IsActive в вашей модели представления:

[UIHint("YesNoDropDown")]
public bool IsActive { get; set; }

и затем:

<%= Html.EditorFor(x => x.IsActive) %>