在asp.net MVC PartialView中绑定DropDownList

时间:2012-08-31 02:17:09

标签: asp.net-mvc binding asp.net-mvc-4 partial-views

我有一个partialView,其<select>包含正在注册的用户的可用角色列表。我是MVC的新手,我正在努力弄清楚如何绑定<select>

通常我会在ascx的Page_Load上执行此操作,例如:

rolesSelect.DataSource = Roles.GetAllRoles().OrderBy(r => r);
rolesSelect.DataBind();

但是对于MVC来说,它完全不同。我的视图和partialView看起来像这样:

Users.cshtml

@model IEnumerable<RobotDog.Models.UserModel>

<table>...</table>
<div id="addUser">
    @Html.RenderPartial("_AddUser")
</div>

_AddUser.cshtml

@model RobotDog.Models.RegisterModel

@using(Html.BeginForm("AddUser","Admin", FormMethod.Post)) {
    @Html.EditorFor(x => x.Email, new { @class = "input-xlarge", @placeholder = "Email"})
    @Html.EditorFor(x => x.UserName, new { @class = "input-xlarge", @placeholder = "User Name"})
    @Html.EditorFor(x => x.Password, new { @class = "input-xlarge", @placeholder = "Password"})
    @Html.DropDownListFor(????) //not sure how to bind this?
}

我的问题是:

  1. 我是否需要将适当的集合从控制器传递到视图到partialView,还是有更实用的可扩展方法?
  2. 是否可以为partialView设置控制器,以便我只需要担心将partialView添加到视图而不是视图的控制器?
  3. 这真的归结为将一组数据绑定到PartialView中的DropDownList的标准做法是什么?

1 个答案:

答案 0 :(得分:2)

Roles集合添加到模型中,并根据需要构建选择列表。

@Html.DropDownListFor(x => x.Role, 
    Model.Roles.Select(role => 
        new SelectListItem() { Text = role.Name, Value = role.Value }
    )
)

Roles添加到模型的替代方法是创建HTML Helper方法。这是一个扩展方法,所以像这样添加:

namespace ExtensionMethods
{
    public static class HtmlHelperExtensions
    {
        public static IEnumerable<SelectListItem> GetRoles(this HtmlHelper helper)
        {
            return new[] {
                new SelectListItem() { Text="Role1" },
                new SelectListItem() { Text="Role2" },
            };
        }
    }
}

然后在Web.Config文件夹下的Views注册命名空间:

<system.web.webPages.razor>
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="ExtensionMethods"/>
      </namespaces>
    </pages>
</system.web.webPages.razor>

现在您可以创建下拉列表:

@Html.DropDownListFor(x => x.Role, Html.GetRoles())