none
Где и когда подгружать значения для DropDownList в MVC? RRS feed

  • Вопрос

  • Добрый день!

    Прошу подсказать, какой из перечисленных вариантов подгрузки значений для DropDownList является более корректным. Итак, я вижу 2 способа:

    1. В действии контроллера подгружать список во ViewData["list"], затем в представлении вызывать <%= Html.DropDownList("testID", (SelectItem)ViewData["list"], "Выберите тест") %>. Недостаток этого метода в том, что если этот список потенциально надо показать в нескольких представлениях, то ViewData нужно заполнять в каждом действии контроллера.
    2. Сделать отдельный контроллер Test с действием List(), которое возвращает частичное представление. Тогда в любом представлении, где нужно вывести DropDownList, нужно будет просто написать: <% Html.RenderAction("List", "Tests", /*возможно, параметры*/); %>. Мне этот способ кажется более красивым, ведь, все равно в действиях контроллера мне этот список нафиг не нужен (меня интересует только выбранное значение). Но меня смущает, что все-таки RenderAction() предназначен больше для прикладной логики, такой как построение меню, вывод курса валют и т.д.

    Может, есть другие варианты, я не придумал.

    P.S. Варианты для DropDownList, в конечном счете, берутся из БД.

    P.S.S. Список значений может зависеть от различных параметров.

    14 августа 2010 г. 12:27

Ответы

  • Лучше использовать отдельный метод контоллера, чтобы повторно использовать код.

    Для вывода DropDownList я использую отдельный метод контроллера. Параметр метода отвечает за то, какой элемент будет иметь свойство Selected=true

    public ViewResult SelectTown( int? townId)
            {
                    var towns = (from Town t in adsRepository.Towns orderby t.Name select new { Text = t.Name, Value = t.TownId, Selected = (townId.HasValue&& t.TownId == townId.Value) }).ToList();
                    ViewData["TownsList"] = (from item in towns select new SelectListItem() { Text = item.Text, Value = item.Value.ToString(), Selected = item.Selected });
                }
                return View();
            }

    ................

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
    <%=Html.DropDownList("TownId", ViewData["TownsList"] as IEnumerable<SelectListItem>)%>

    .......................

      <%Html.RenderAction("SelectTown", "towns", new { townId = Model.TownId });%>

    • Помечено в качестве ответа I.Vorontsov 19 августа 2010 г. 8:21
    14 августа 2010 г. 14:11

Все ответы

  • Лучше использовать отдельный метод контоллера, чтобы повторно использовать код.

    Для вывода DropDownList я использую отдельный метод контроллера. Параметр метода отвечает за то, какой элемент будет иметь свойство Selected=true

    public ViewResult SelectTown( int? townId)
            {
                    var towns = (from Town t in adsRepository.Towns orderby t.Name select new { Text = t.Name, Value = t.TownId, Selected = (townId.HasValue&& t.TownId == townId.Value) }).ToList();
                    ViewData["TownsList"] = (from item in towns select new SelectListItem() { Text = item.Text, Value = item.Value.ToString(), Selected = item.Selected });
                }
                return View();
            }

    ................

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
    <%=Html.DropDownList("TownId", ViewData["TownsList"] as IEnumerable<SelectListItem>)%>

    .......................

      <%Html.RenderAction("SelectTown", "towns", new { townId = Model.TownId });%>

    • Помечено в качестве ответа I.Vorontsov 19 августа 2010 г. 8:21
    14 августа 2010 г. 14:11
  • Хорошо. Спасибо за ответ. Мне тоже так кажется изящнее что ли. Единственное, что не нравится, так это то, что при RenderAction() фактически опять роутинг будет проводиться, опять подключение к БД создаваться (ну или DataContext). Может, конечно, это копейки...

    А по поводу формирования списка, мне кажется, красивее сделать так:

    public ViewResult SelectTown(int? townId)
            {
                    var towns = from Town t in adsRepository.Towns orderby t.Name select t;
                    ViewData["TownsList"] = new SelectList(towns, "TownId", "Name", townId);
                    return View();
            }

    ................

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
    <%=Html.DropDownList("TownId", ViewData["TownsList"] as SelectList)%>

    .......................

      <% Html.RenderAction("SelectTown", "towns", new { townId = Model.TownId }); %>

    14 августа 2010 г. 15:07
  • А по поводу формирования списка, мне кажется, красивее сделать так:

    public ViewResult SelectTown(int? townId)
            {
                    var towns = from Town t in adsRepository.Towns orderby t.Name select t;
                    ViewData["TownsList"] = new SelectList(towns, "TownId", "Name", townId);
                    return View();
            }

    Да. Наверно так лучше будет.
    14 августа 2010 г. 15:49
  • Кстати, а почему не через строго типизированные view, ViewUserControl<SelectList>?
    16 августа 2010 г. 11:02
  • лично я сделал через строго типизированную view))
    17 августа 2010 г. 4:48
  •  При ViewUserControl нужно реализовывать логику по выборке данных для selectlist отдельно.

    А у меня  townscontroller сразу через RenderAction выводит selectlist с необходимыми данными. То есть мне не нужно в каждом методе контроллера, в котором  нужен SelectList, заниматься выборкой данных для него.

    И в MVC 2 почему-то не метода Html.RenderUserControl

    http://www.matthidinger.com/archive/2008/02/21/asp.net-mvc-usercontrols-start-to-finish.aspx

    17 августа 2010 г. 7:57
  • Я имел в виду использовать типизированный SelectTown, а не добавлять свойство в модели для всех остальных вьюшек :)
    Что-то вроде:
     
    public ViewResult SelectTown(int? townId)
    {
        var towns = from Town t in adsRepository.Towns orderby t.Name select t;
        return View(new SelectList(towns, "TownId", "Name", townId));
    }
    //----
    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SelectList>" %>
    <%= Html.DropDownList("TownId", this.Model) %>
    17 августа 2010 г. 14:30