Как я могу легко создать DropDownList из контроллера - PullRequest
1 голос
/ 20 июня 2011

У меня есть частичное представление, которое содержит несколько <div>, которые выглядят одинаково, и каждый из них, в свою очередь, содержит DropdownList. Теперь выбранные значения в DropdownLists обычно отличаются. И первоначальный список значений происходит из какого-то внешнего источника. Так что это не сработает:

public PartialViewResult GetMeals()
{
      var meals = DataContext.GetMeals();
      ViewBag.Units = new SelectList(DataContext.GetUnits,"Id","Name");

      return PartialView("_Meals", meals);
 }

@foreach (var m in Meals)
 {
     <div>  
         @Html.DropDownList("Units", ViewBag.Units as List<SelectListItem>)
     <dig>

Конечно, я могу создать другое частичное представление для каждой Еды, но я не хочу входить в иерархию частичных представлений и создавать Частичное внутри другого Частичного (хотя Лео ДиКаприо это бы понравилось)

Можете ли вы, ребята, дать мне совет?

1 Ответ

2 голосов
/ 20 июня 2011

Вот что я бы сделал. Это первое, что нужно, чтобы избавиться от ViewBag. Затем определите модель вида:

public class MealViewModel
{
    public string MealDescription { get; set; }

    public string SelectedUnit { get; set; }
    public IEnumerable<SelectListItem> Units { get; set; }
}

Внутри этой модели представления вы помещаете только то, что нужно вашему представлению (в данном случае частичному представлению).

и тогда мое действие контроллера заполнило бы эту модель представления путем объединения данных из любого места:

public ActionResult GetMeals()
{
    var meals = DataContext.GetMeals().ToList(); // <-- being eager with .ToList()
    var units = DataContext.GetUnits().ToList(); // <-- being eager with .ToList()
    var viewModel = meals.Select(meal => new MealViewModel
    {
        MealDescription = meal.Description,
        SelectedUnit = meal.UnitId,
        Units = units.Select(unit => new SelectListItem
        {
            Value = unit.Id.ToString(),
            Text = unit.Name
        })
    });
    return PartialView("_Meals", viewModel);
}

и внутри частичного _Meals Я бы использовал шаблоны редактора:

@model IEnumerable<MealViewModel>
@Html.EditorForModel()

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

@model MealViewModel
<h3>@Html.DisplayFor(x => x.MealDescription)</h3>
<div>    
    @Html.DropDownListFor(
        x => x.SelectedUnit,
        new SelectList(Model.Units)
    )
</div>

Теперь больше циклов, приведений, неверно названных элементов управления вводом. Вы получаете строго типизированный, представления Intellisense, вкуснятина: -)

Теперь, когда вы смотрите на действие контроллера, должно быть что-то, что вас беспокоит: этот повторяющийся код отображения между вашими моделями доменов и моделями представления. Войдите в мир AutoMapper и вы получите действительно красивый код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...