2

我对 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 个角色的用户。

4

1 回答 1

1

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

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

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

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

@Html.DropDownListFor(x => x.SelectedUser, Model.Users)
于 2013-04-04T23:33:04.047 回答