Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为用户角色创建下拉列表_C#_Model View Controller_Asp.net Mvc 5_Html.dropdownlistfor_Asp.net Mvc Viewmodel - Fatal编程技术网

C# 为用户角色创建下拉列表

C# 为用户角色创建下拉列表,c#,model-view-controller,asp.net-mvc-5,html.dropdownlistfor,asp.net-mvc-viewmodel,C#,Model View Controller,Asp.net Mvc 5,Html.dropdownlistfor,Asp.net Mvc Viewmodel,我正在努力实现的目标 如果一个用户是3个角色的成员,我想生成3个包含所有角色和要选择的每个用户角色的下拉列表。我不想使用ViewBag 问题 目前,我可以生成3个DropDownLists,其中包含所有角色,但未选择用户所属的3个角色。如果用户是Admin、PowerUser和Manager角色的成员,则在所有3个下拉列表中仅选择最后一个角色Manager 问题: 如何使用正确选择的角色生成所需的DropDownList 视图模型 public class UserViewModel {

我正在努力实现的目标

如果一个用户是3个角色的成员,我想生成3个包含所有角色和要选择的每个用户角色的下拉列表。我不想使用ViewBag

问题

目前,我可以生成3个DropDownLists,其中包含所有角色,但未选择用户所属的3个角色。如果用户是Admin、PowerUser和Manager角色的成员,则在所有3个下拉列表中仅选择最后一个角色Manager

问题:

如何使用正确选择的角色生成所需的DropDownList

视图模型

public class UserViewModel
{
    public IEnumerable<SelectListItem> RolesList { get; set; }
    public string RolesListId { get; set; }
}
看法

@for(int i=0;ix.Selected==true.Count();i++)
{
@Html.DropDownListFor(model=>model.RolesListId,model.RolesList,“选择角色…”)
}

这是您需要的代码,但是当用户可以有多个角色时,最好使用
复选框列表,而不是使用
下拉列表

  • 用户和角色之间存在(n到n)关系,DropDownlast永远不能表示这种关系
  • 如果您使用的不止是dropdownlist,用户可以从列表1中选择role1,再从列表2中选择role1,再从列表3中选择role1
  • 若使用dropdownlist,最终用户如何向用户添加角色
无论如何,下面是您需要的DropDownList代码:

@foreach (var item in Model.RolesList.Where(x => x.Selected))
{
    @Html.DropDownList("SelectedRole", new SelectList(Model.RolesList, "Value", "Text", item.Value), "Select a Role")
}
@foreach (var item in (SelectList)ViewBag.RoleId)
{
    <input type="checkbox" name="SelectedRoles" value="@item.Value" class="checkbox-inline" />
    @Html.Label(item.Value, new { @class = "control-label" })
}
下面是您决定使用复选框时应该使用的代码:

@foreach (var item in Model.RolesList.Where(x => x.Selected))
{
    @Html.DropDownList("SelectedRole", new SelectList(Model.RolesList, "Value", "Text", item.Value), "Select a Role")
}
@foreach (var item in (SelectList)ViewBag.RoleId)
{
    <input type="checkbox" name="SelectedRoles" value="@item.Value" class="checkbox-inline" />
    @Html.Label(item.Value, new { @class = "control-label" })
}
@foreach(选择列表)ViewBag.RoleId中的变量项)
{
@Label(item.Value,新的{@class=“control Label”})
}

RoleListId包含单个id?RoleListId包含单个id-是所选选项将是
RoleListId
的值(因为您绑定到
RoleListId
)。绑定到属性时,将忽略设置
SelectListItem
Selected
属性。但是
RolesListId
是一种值类型(
string
)`所以你无论如何都不能将多个下拉列表绑定到它,所以不清楚你想要实现什么。我怀疑你想要的是属性
RolesListId
成为
List
,你想要一个
@Html.ListBoxFor(m=>m.RolesListId,Model.RolesList)
将显示所有角色,如果
角色列表ID
包含3个值,则将选择这3个选项。您接受的解决方案意味着您只能有3个角色。不能添加新角色。您不能删除角色。不能进行客户端或服务器端验证。您可以多次选择同一角色。你需要一个
我真的需要使用dropdownlists,原来的代码是用于复选框的,所以我已经有了可用的复选框。可能有50个角色,所以复选框太多了。如果用户只是1个角色的成员,那么这只是一个下拉列表,而不是50个复选框。@DrewWelsh也许我可以修复您的代码来呈现下拉列表,但这是一个不正确的设计。用户和角色之间存在(n到n)关系,DropDownlast永远不能表示这种关系。如果您使用的不仅仅是dropdownlist,用户可以从列表1中选择role1,再从列表2中选择role1,再从列表3中选择role1。我已经测试了您的解决方案,效果非常好,谢谢。在不忘恩负义的情况下,我如何使用DropDownListFor?@DrewWelsh不客气,如果你想使用
DropDownListFor(model=>model.SelectedRole,…)
那么你应该在
UserViewModel
中有一个
SelectedRole
类型的属性,当您发现某个答案有帮助时,您可以欣然接受它作为答案,并/或投票选出对其他用户更有用的答案:)