【问题标题】:ASP.NET MVC 3 Dropdownlist of UsersASP.NET MVC 3 用户下拉列表
【发布时间】:2012-02-22 17:05:30
【问题描述】:

在我的应用程序中,我已将UserId 关联到数据库中的一个表。我需要在创建新项目时从下拉列表中选择用户名。并且'可以用元素 viewbag 做到这一点吗?

@Html.EditorFor(model => model.UserId)

我使用默认的会员提供程序,所以我不能使用实体框架来解决这个问题

编辑

编辑 2

这是我的创建动作:

[HttpPost]
public ActionResult Create(Employe employe)
{
        var users = Roles.GetUsersInRole("Admin");
        SelectList list = new SelectList(users);
        ViewBag.Users = list;
        if (ModelState.IsValid)
        {
            **employe.EmployeID = users;**
            db.Employes.Add(employe);
            db.SaveChanges();
}

这不起作用。错误是:

无法将类型'string[]'隐式转换为'string'

Employee我的模型

public class Employee
{
        [Key]
        public int EmployeID { get; set; }

        public Guid UserId { get; set; }

        public string Name { get; set; }

        [ForeignKey("UserId")]
        public virtual MembershipUser User
        {
            get
            {
                return Membership.GetUser(this.Name); //Changed this to Name 
            }
        }

    }
}

查看:

@Html.DropDownList("Users", ViewBag.Users as SelectList);

我在UserId 字段中的结果不是UserId,而是000000-000000-0000000-00000

【问题讨论】:

    标签: asp.net-mvc drop-down-menu html.dropdownlistfor roleprovider


    【解决方案1】:

    如何将用户列表设置为 ViewBack 中的 SelectItem 是的,您应该能够通过将您的收藏传递给 ViewBag 来做到这一点,然后从中创建您的下拉列表:

    在你的控制器中

            var users = Roles.GetUsersInRole("Admin");
            SelectList list = new SelectList(users);
            ViewBag.Users = list;
    

    在您的视图中(如果您使用的是 Razor)

    @Html.DropDownList("Users", ViewBag.Users as SelectList);
    

    在此处阅读有关 SelectListItem 的更多信息:

    也可以看看:

    问题变成了更多。这是我解决问题的想法:

    控制器

    public ActionResult Mirko() {
        List<SelectListItem> items = new List<SelectListItem>();    
        foreach (string userName in Roles.GetUsersInRole("Admin")) {
            var user = Membership.GetUser(userName);
            SelectListItem li = new SelectListItem {
                Value = user.ProviderUserKey.ToString(),
                Text = user.UserName,
            };
            items.Add(li);
        }
        items.Add(new SelectListItem { Text = "Please Select...", Value = "na" , Selected = true});
        ViewBag.Users = items;
        return View();                
    }
    
    [HttpPost]
    public ActionResult Mirko(Employee employee) {
        if(IsValideEmployee(employee)) {
            /*Only used to show that user was retrieved*/
            TempData["message"] = "Saved Employee";
            TempData["user"] = employee.User;
    
           /* employeeRepository.Save(employee) */
    
            /* Redirect to where you want to go */
            return RedirectToAction("Mirko", "Home");
        }
        return View(employee);
    }
    
    private bool IsValideEmployee(Employee emp) {
        if (emp.Name == "na")
            ModelState.AddModelError("UserId", "You must select a user!");
        /*Do some validation here*/
        //ModelState.Add("Name", "You must set the user name!")
        return ModelState.IsValid;
    }
    

    查看

    @model StackOverFlowExample.Models.Employee
    @{
        MembershipUser user = null;
        ViewBag.Title = "Mirko Example";
        var users = ViewBag.Users as IEnumerable<SelectListItem>;
    }
    
    @if (TempData["message"] != null) {
        user = TempData["user"] as MembershipUser;
        <h3>@TempData["message"]</h3>
        <div>
            <span>You selected @user.UserName</span>
            <ul>
                <li>Email: @user.Email</li>
                <li>Last Logged In: @user.LastLoginDate.ToString("d")</li>
                <li>Online: @user.IsOnline</li>
            </ul>
        </div>
    }
    
    @using (@Html.BeginForm()) { 
        <label for="UserId">Associate Employee To User:</label>
        @Html.DropDownListFor(m => m.UserId, @users)
        @Html.HiddenFor(m => m.Name)                                               
        <input type="submit" value="Save" id="save-employee"/>
    }
    <div id="status" style="display:none;"></div>
    
    <script type="text/javascript">
        $(document).ready(function () {
            $("#UserId").change(function () {
                //Set value of name 
                $("#Name").val($(this).children("option:selected").text());            
            });
            $("#save-employee").click(function (e) {
                var value = $("#Name").val();
                if (value == "" || value == "na") {
                    e.preventDefault();
                    $("#status").html("<h3>You must select a user!</h3>").toggle();
                }
            });
        });
    </script>
    

    【讨论】:

    • 谢谢....我需要一个值 GetUserbyRole() 而不是“Collection”,以便我可以看到仅处于某个角色的用户,您有这种方法的一些示例吗?跨度>
    • 你的意思是 "Roles.GetUsersInRole("role name")" 吗?
    • 我已经更新了我的帖子...包含在 UserId 字段中有效,但没有用户 ID,但 00000-000000-00000-0000
    • 何时为 Employee.UserId 设置 Guid? "GetUsersInRole" 的 string[] 结果只是用户名。我已经更新了您的 MembershipUser 方法的代码。
    • 感谢代理...现在我用这段代码解决了。 forums.asp.net/t/1772815.aspx/1?Select+Users+with+Dropdownlist
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 2012-05-27
    • 1970-01-01
    • 2011-10-05
    相关资源
    最近更新 更多