C# 如何从控制器中轻松创建DropDownList

C# 如何从控制器中轻松创建DropDownList,c#,asp.net-mvc-3,razor,C#,Asp.net Mvc 3,Razor,我有一个局部视图,其中包含几个看起来相同的,每个视图依次包含一个DropdownList。现在,下拉列表中的选定值通常不同。初始值列表来自一些外部源。 所以那是行不通的: public PartialViewResult GetMeals() { var meals = DataContext.GetMeals(); ViewBag.Units = new SelectList(DataContext.GetUnits,"Id","Name"); retur

我有一个局部视图,其中包含几个看起来相同的
,每个视图依次包含一个DropdownList。现在,下拉列表中的选定值通常不同。初始值列表来自一些外部源。 所以那是行不通的:

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>
public PartialViewResult getFounds()
{
var fines=DataContext.getfines();
ViewBag.Units=newselectList(DataContext.GetUnits,“Id”,“Name”);
返回PartialView(“餐”,餐);
}
@foreach(每餐中的var m)
{
@Html.DropDownList(“单位”,ViewBag.Units作为列表)
当然,我可以为每顿饭创建另一个局部视图,但我不想进入局部视图层次结构,在另一个局部视图中创建局部视图(尽管利奥·迪卡普里奥会喜欢这样)


你们能给我一个建议吗?

下面是我要做的。第一件事是去掉ViewBag。然后定义一个视图模型:

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

    public string SelectedUnit { get; set; }
    public IEnumerable<SelectListItem> Units { get; set; }
}
最后,我将为一顿饭定义一个编辑器模板:(
~/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>
@model MealViewModel
@DisplayFor(x=>x.MealDescription)
@Html.DropDownListFor(
x=>x.SelectedUnit,
新选择列表(型号单位)
)
现在有更多的循环、强制转换和错误命名的输入控件。您可以获得强类型、支持Intellisense的视图,yummy:-)

现在,当您查看控制器操作时,一定有什么困扰您:域模型和视图模型之间重复的映射代码。进入的世界,您将得到非常漂亮的代码

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