我认为在模型中包含模型?

时间:2013-04-04 23:20:06

标签: asp.net asp.net-mvc razor

我对ASP / MVC3 / C#非常陌生,但目前正在开展一个项目,要求我将数据库中的所有用户列为下拉列表,理想情况下我想过滤这个以便它只显示某些角色的用户(即管理员,员工或学生)。

但是我的问题在于以下内容,我有一个控制器(Requests.cs),其中包含执行以下操作的方法,并允许我转到http://server/Requests/UserList

    public ActionResult UserList()
    {
        // Create our view model
        var users = Membership.GetAllUsers();
        var model = new StudentListViewModel
        {

            Users = users.OfType<MembershipUser>().Select(x => new SelectListItem
            {

                Value = x.ProviderUserKey.ToString(),
                Text = x.UserName
            })
        };

        return View(model);
    }

看起来像这样的视图模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

namespace AcademicRegistry.ViewModels
{
    public class StudentListViewModel
    {
        [Display(Name = "select user")]
        public string SelectedUser { get; set; }
        public IEnumerable<SelectListItem> Users { get; set; }
    }
}

相关观点:

@model AcademicRegistry.ViewModels.StudentListViewModel

@using (Html.BeginForm())
{
    @Html.LabelFor(x => x.SelectedUser)
    @Html.DropDownListFor(x => x.SelectedUser, Model.Users)
    <button type="submit">OK</button>
}

所有这些工作都很好(实际上这是我在这里发现的另一篇文章的所有代码),这个视图显示了我想要的内容,即一个下拉列表,其值设置为userId,文本显示为用户名。

但是我希望在不同的视图中显示它,即EditUser,但是这已经有一个与之关联的模型(@model AcademicRegistry.Models.Requests):

@model AcademicRegistry.Models.Requests 

@{
    ViewBag.Title = "Edit";
}

<h2>Edit</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Requests</legend>

        @Html.HiddenFor(model => model.Id)

        <div class="editor-label">
            @Html.LabelFor(model => model.StudentId)
        </div>
        <div class="editor-field">
             *Wanting the dropdown list to show here*
        </div>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

我想知道是否有人知道如何让我的下拉秀显示它需要的地方?这个下拉列表将在很多页面上使用,因此理想情况下需要重复使用,并且正如我所提到的那样过滤仅显示属于我设置的3个角色的用户。

1 个答案:

答案 0 :(得分:1)

您需要放置当前获取用户列表的代码,并将SelectListItem列表创建为其他控制器可以访问的单独方法。

然后,您将Users属性添加到将显示此列表的ViewModel:

public IEnumerable<SelectListItem> Users { get; set; }

所以在这一点上,你有你需要显示的列表。然后,您可以创建一个获取列表并呈现它的用户控件,或者只使用您当前拥有的内置DropDownList:

@Html.DropDownListFor(x => x.SelectedUser, Model.Users)