如何在多个模型视图上使用下拉列表

本文关键字:下拉列表 视图 模型 | 更新日期: 2023-09-27 18:30:25

我已经有一段时间没有访问StackOverflow了...

因此,我开始使用 ASP.NET MVC4 和 Razor,使用模型优先的实体框架方法。到目前为止,我喜欢它,尽管我在记住某些东西时遇到了问题。

例如,现在我正在尝试实现一个简单的登录表单,其中包括用户名 + 密码 + 用户类型。但是,正如我从 MVC3 的经验中回忆的那样,您不能传递两个模型......除非你使用元组。

因此,我的目标是通过@HTML帮助程序创建表单,但我唯一无法使用的是 DropdownListFor,它将显示用户类型列表并在表单中应用它们。

@model Tuple<EMS_v1.User, EMS_v1.UserType>
@{
ViewBag.Title = "Log in";
}
<section id="loginForm">
<h2>Use a local account to log in.</h2>
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
    <legend>Log in Form</legend>
    <ol>
        <li>
            @Html.Label(" User Name")
            @Html.TextBoxFor(m => m.Item1.User_Name)
            @Html.ValidationMessageFor(m => m.Item1.User_Name)
        </li>
        <li>
            @Html.Label("Password")
            @Html.PasswordFor(m => m.Item1.User_Pass)
            @Html.ValidationMessageFor(m => m.Item1.User_Pass)
        </li>
        <li>
            @Html.Label("Portal Access")
      >>>>> @Html.DropDownListFor(model => model.Item2.Type_Id, new SelectList(Model.Item2, "Type_Id", "Description"));
        </li>
    </ol>
    <input type="submit" value="Log in" />
</fieldset>
}
</section>
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

我的实体框架模型包括 UserType(int Type_Id、字符串说明)和 User(int Id、字符串 User_Name、字符串 User_Pass、UserTypeType_Id),它们UserTypeType_Id引用回 UserType 表的外键。

有没有办法从UserType表生成列表或IEnumerable?因为我确定我发布的代码无法正常工作。

如何在多个模型视图上使用下拉列表

在控制器的操作方法中创建一个集合,并将其分配给某个 Viewbag 属性例如ViewBag.UserType = new SelectList();

此集合应该是 IEnumerable 类型对象。

现在从视图中使用此ViewBag属性。

例如@Html.下拉列表列表("用户类型" , "选择用户类型")

您确实不应该在视图中使用实体框架实体。创建视图模型,例如:

public class LoginViewModel
{
    public string Username{get;set;}
    public string Password{get;set;}
    public int UserTypeId{get;set;}
    public IEnumerable<UserTypes> UserTypes{get;set;}
}

然后在下拉列表中:

@Html.DropDownListFor(m => m.UserTypeId, Model.UserTypes.Select(t => new SelectListItem { Value = t.TypeId.ToString(), Text = t.Description }));