Преобразование HTML.EditorFor в выпадающий список (html.dropdownfor?) - PullRequest
15 голосов
/ 01 марта 2012

В настоящее время я использую элемент управления Html.EditorFor на странице просмотра «Создать» по умолчанию, подобной этой.

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

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

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

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

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

1 Ответ

33 голосов
/ 01 марта 2012

Чтобы создать выпадающий список, вам нужно 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) %> 
...