Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.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# 具有选定值的MultiselectList未在视图中预先选定_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 4_Razor - Fatal编程技术网

C# 具有选定值的MultiselectList未在视图中预先选定

C# 具有选定值的MultiselectList未在视图中预先选定,c#,asp.net,asp.net-mvc,asp.net-mvc-4,razor,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Razor,我有一个简单的服务,就是: 1.获取系统中的所有角色 2.检查当前选定用户的角色 3.在下拉列表中呈现所有角色,默认情况下选择当前用户角色 为此,我有以下代码: public ActionResult Edit(string userId) { var user = _oAuthUserService.GetUsers()?.Where(u => u.UserId == userId).FirstOrDefault();

我有一个简单的服务,就是: 1.获取系统中的所有角色 2.检查当前选定用户的角色 3.在下拉列表中呈现所有角色,默认情况下选择当前用户角色

为此,我有以下代码:

 public ActionResult Edit(string userId)
        {

            var user = _oAuthUserService.GetUsers()?.Where(u => u.UserId == userId).FirstOrDefault();

            var userRoles = user.Roles; //[Admin,Manager]

            var allRolesFromService = _oAuthUserService.AllRoles.Select(x=>new {
                Id =x.RoleName,
                Name =x.RoleName
            }).ToList(); //All roles in the System [Role1,Role2,Role3,Admin,Manager]


            ViewData["AllRoles"] = new MultiSelectList(allRolesFromService, "Id", "Name", userRoles);


            return View(user);


        }
鉴于我所做的

@Html.ListBox("AllRoles", (MultiSelectList)ViewData["AllRoles"], new { multiple = "multiple" });

但是当我导航到视图时,没有一个项目是预先选择的?这里缺少什么?

出现问题的原因是,您使用的
ViewData
关键字名称与绑定到此行中的
ListBox
helper的型号名称相同:

@Html.ListBox("AllRoles", (MultiSelectList)ViewData["AllRoles"], new { multiple = "multiple" })
假设
AllRoles
是viewmodel类中的数组或列表属性,则不能将其作为
ViewData
键名重用,因为它们之间会发生命名冲突,导致选项列表无法正确显示。您可以使用与viewmodel属性名称不同的任何名称重命名
ViewData
键名称:

ViewData["AllRolesList"] = new MultiSelectList(allRolesFromService, "Id", "Name", userRoles);
然后在
ListBox(For)
helper中使用新的键名:

列表框帮助程序

@Html.ListBox("AllRoles", (MultiSelectList)ViewData["AllRolesList"], new { multiple = "multiple" })
@Html.ListBoxFor(model => model.AllRoles, (MultiSelectList)ViewData["AllRolesList"], new { multiple = "multiple" })
listboxforhelper

@Html.ListBox("AllRoles", (MultiSelectList)ViewData["AllRolesList"], new { multiple = "multiple" })
@Html.ListBoxFor(model => model.AllRoles, (MultiSelectList)ViewData["AllRolesList"], new { multiple = "multiple" })

尝试替换您的
ViewData
键名,因为
AllRoles
已用于绑定
ListBox
,避免了潜在的命名冲突。或者对强类型viewmodel属性使用
ListBoxFor
。并且更改viewDataKey会起作用!!尽管这可能是个问题,但你能回答这个问题吗?我会接受这个解决方案。