ASP.NET MVC: DropDownList - из DataSource, SelectedItem и доступ встроенного кода в представлении - PullRequest
3 голосов
/ 30 июля 2010

Насколько я могу судить, существует 3 способа создания DropDownList в ASP.NET MVC View:

  1. Ручной код HTML вручную
  2. <asp:DropDownList ID="someID" runat="server"></asp:DropDownList>
  3. <%= Html.DropDownList("someID") %>

Я думаю, что мы все можем согласиться с тем, что № 1 (как правило) является пустой тратой времени.

С # 2 это выглядит как «WebForms», но имеет преимущество в том, что если вы пишете View, вы можете иметь доступ к объекту, который вы создали, через встроенный код, который происходит после Это. Например:

<asp:DropDownList ID="someID" runat="server"></asp:DropDownList>
<% 
   someID.SelectedIndex = 0;  
   string someString = someID.SelectedValue.ToString();
%>

Это не представляется возможным с # 3.

Приятная вещь, которую я обнаружил в # 3 (способ HTML Helper), заключается в том, что, передавая ей строку, она устанавливает имя и идентификатор в строку, а также использует эту строку для поиска в словаре ViewData и автоматического -генерировать соответствующие теги для DropDownList на основе SelectList, который был добавлен в словарь ViewData, который был добавлен в вызывающий контроллер.

// controller code
ViewData["someID"] = new SelectList(someMethod().ToList());  

Насколько я могу судить, я не могу понять, есть ли способ автоматически сгенерировать теги с помощью <asp:DropDownList> или я должен сам создать их вручную.

Каков обычно лучший подход для реализации DropDownList в ASP.NET MVC?

1 Ответ

1 голос
/ 30 июля 2010
<%= Html.DropDownList("name", new SelectList(someEnumerable, "valueProperty", "textProperty")) %>

, где someEnumerable - это свойство вашего viewModel.

, например:

class Person
{
    int id;
    string name;
}

class myVM
{
    IEnumerable<Person> people;
}

<%= Html.DropDownList("name", new SelectList(Model.people, "id", "name")) %>

Редактировать не создавать SelectList в вашем контроллерепросмотреть конкретный код и принадлежать в представлении, просто отправьте свой IEnumerable в viewmodel.

...