Вот что я бы сделал. Это первое, что нужно, чтобы избавиться от 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 и вы получите действительно красивый код.