从mvc3 DropDown列表中渲染并选择数据

pan*_*njo 1 c# asp.net-mvc-3

简单的情况

一个对象用户有许多UserGroup.

我想在mvc3表单编辑或创建操作上实现从下拉列表中选择UserGroups.

控制器:

private List<User> GetAllUsers()
{
    List<User> users;
    users = find all users to List...
    return users;
}

public ActionResult Edit(Guid Id)
{
   ViewBag.UserGroups = new SelectList(GetAllUsers(), "UserId", "Name");
   return View();
}
Run Code Online (Sandbox Code Playgroud)

视图:

<div class="editor-label">
    @Html.LabelFor(model => model.UserGroupId, "UserGroupId")
</div>
<div class="editor-field">
    @Html.DropDownList(WHAT TO PUT HERE ?);
    @Html.ValidationMessageFor(model => model.UserGroupId)
</div>
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 5

哦,请使用视图模型,切掉ViewBag的垃圾,每次看到它都会让我生病.

public class UserViewModel
{
    public int UserGroupId { get; set; }
    public IEnumerable<SelectListItem> UserGroups { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后:

public ActionResult Edit(Guid Id)
{
    var model = new UserViewModel
    {
        UserGroups = new SelectList(GetAllUsers(), "UserId", "Name")
    }
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

并在视图中:

@model UserViewModel
...
<div class="editor-label">
    @Html.LabelFor(model => model.UserGroupId, "UserGroupId")
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(x => x.UserGroupId, Model.UserGroups);
        @Html.ValidationMessageFor(model => model.UserGroupId)
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

但如果你想让我生病并保持ViewCrap:

@Html.DropDownListFor(
    x => x.UserGroupId, 
    (IEnumerable<SelectListItem>)ViewBag.UserGroups
)
Run Code Online (Sandbox Code Playgroud)

  • 当然有必要.当你看到这样的问题每天有数百人使用ViewBag并且遇到ASP.NET MVC问题时,你最终会生病.这是治愈的唯一方法.人们正在与ASP.NET MVC一样苦苦挣扎,他们挣扎的唯一原因是因为他们没有使用视图模型. (2认同)
  • @Jorge,对ViewBag不可能有爱.只有仇恨.它没有季节.没有夏天,没有冬天.它无处不在,无论您何时在代码编辑器中键入这些关键字,它都准备好咬你.所以我们需要追逐它并根除它.越快越好.如果我有一个ASP.NET MVC 5的单一功能请求,那就是从带有多汁文本的ViewBag/ViewData getter中抛出一个异常. (2认同)
  • 是的,这就是我坚持的原因.所以没有像他这样的人.因为SO是一个很好的引用网站,很多人都读过,不仅仅是OP. (2认同)