Asp.net mvc 选中复选框未显示在ActionResult表单集合MVC 6中
为了使多个复选框工作,我的代码经历了难以置信的变化。我取消了formsCollection,我试图使用它在视图上的复选框中循环。我在控制器和视图中使用了很多循环,我不再关心“关注点分离”或MVC的任何现代意义。在MS Access中,您可以将一整串函数合并到一行中,这使得它无法读取,但仍然有效。我总是把逻辑展开,以便理解它并逐步理解它。我可能正在用一种二年级的方式来处理MVC6这个新的现代世界,但我不在乎。我可以离开角色垃圾,转而用CRUD做一些事情。我也不想让Stephen Muecke生气,因为我的大部分MVC知识都是他对我的问题的关注。在用Bing搜索之后,我发现非常简单且有用。我的大部分观点已经建立起来了。我的时间花在显示已检查的用户角色上。现在,我有了一个视图和一个编辑表单,可以通过复选框为所选用户添加或删除角色。不漂亮但很好吃。(“MVC6”是我项目的名称,而不是内置名称)。我不必使用Owin依赖项。我必须添加的唯一依赖项是启用会话,以便发送TempData[“Status”]消息。其他一切都是现成的 查看:Asp.net mvc 选中复选框未显示在ActionResult表单集合MVC 6中,asp.net-mvc,checkbox,collections,httprequest,form-submit,Asp.net Mvc,Checkbox,Collections,Httprequest,Form Submit,为了使多个复选框工作,我的代码经历了难以置信的变化。我取消了formsCollection,我试图使用它在视图上的复选框中循环。我在控制器和视图中使用了很多循环,我不再关心“关注点分离”或MVC的任何现代意义。在MS Access中,您可以将一整串函数合并到一行中,这使得它无法读取,但仍然有效。我总是把逻辑展开,以便理解它并逐步理解它。我可能正在用一种二年级的方式来处理MVC6这个新的现代世界,但我不在乎。我可以离开角色垃圾,转而用CRUD做一些事情。我也不想让Stephen Muecke生气,
@using MVC6.Models
@using Microsoft.AspNet.Http
@model Microsoft.AspNet.Identity.EntityFramework.IdentityUser
@{
ViewBag.Title = "Edit User";
var roles = new MVC6Context().Roles.ToList();
var usersroles = new MVC6Context().UserRoles.ToList();
}
<ol class="breadcrumb">
<li>@Html.ActionLink("Administration", "Index", "Admin")</li>
<li>@Html.ActionLink("Users", "Index", "UserManagement")</li>
<li>Edit User</li>
</ol>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary()
@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model => model.Email)
<h3>Username:</h3>
<div class="form-control">
@Model.Email
</div>
<h3>Roles:</h3>
if (roles.Any())
{
<div >
@foreach (var role in roles)
{
bool isinrole = false;
@foreach (var ur in usersroles)
{
@if (Model.Id == ur.UserId) //usersroles returns all roles for all users
{
@if(ur.RoleId == role.Id)
{
isinrole = true;
}
}
}
@if (isinrole)
{
<input type="checkbox" name="checkRoles" value="@role.Name" checked />
@Html.Label(role.Name)
}
else
{
<input type="checkbox" name="checkRoles" value="@role.Name"/>
@Html.Label(role.Name)
}
<br/>
}
</div>
<br />
<button type="submit" class="btn btn-default">Save</button> <span style="color:red;">@if (@TempData["Status"] != null){@TempData["Status"]}</span>
}
else
{
<div class="alert alert-info" role="alert">
No roles available
</div>
}
<br />
@使用MVC6.Models
@使用Microsoft.AspNet.Http
@型号Microsoft.AspNet.Identity.EntityFramework.IdentityUser
@{
ViewBag.Title=“编辑用户”;
var roles=new MVC6Context().roles.ToList();
var usersroles=new MVC6Context().UserRoles.ToList();
}
@ActionLink(“管理”、“索引”、“管理”)
@ActionLink(“用户”、“索引”、“用户管理”)
编辑用户
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary()
@Html.HiddenFor(model=>model.Id)
@Html.HiddenFor(model=>model.Email)
用户名:
@模型。电子邮件
角色:
if(roles.Any())
{
@foreach(角色中的var角色)
{
bool-isinrole=false;
@foreach(usersroles中的var-ur)
{
@if(Model.Id==ur.UserId)//usersroles返回所有用户的所有角色
{
@if(ur.RoleId==role.Id)
{
isinrole=true;
}
}
}
@如果(isinrole)
{
@Label(role.Name)
}
其他的
{
@Label(role.Name)
}
}
保存@if(@TempData[“Status”!=null){@TempData[“Status”]}
}
其他的
{
没有可用的角色
}
控制器
[HttpGet]
public ActionResult Edit(string userId)
{
return View(context.Users.FirstOrDefault(u => u.Id == userId));
}
[HttpPost]
public async Task<ActionResult> Edit(string[] checkRoles, string userID)
{
var UserManager = _serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
var RoleManager = _serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
var allRoles = RoleManager.Roles.ToList();
var user = await UserManager.FindByIdAsync(userID);
var usersRoles = await UserManager.GetRolesAsync(user);
//LOOP THROUGH ROLES
foreach (var item in allRoles)
{
bool wasChecked = false;
//ALL CHECKBOXES THAT WERE CHECKED
foreach (var roleChecked in checkRoles)
{
if (item.Name == roleChecked)
{
wasChecked = true;
}
}
//ALL CHECKBOXES THAT WERE NOT CHECKED
if (wasChecked == false)
{
//IF USER HAS ROLE, REMOVE IT
if (await UserManager.IsInRoleAsync(user, item.Name))
{
await UserManager.RemoveFromRoleAsync(user, item.Name);
}
}
else //IF CHECK BOX CHECKED THEN ADD ROLE TO USER
{
await UserManager.AddToRoleAsync(user, item.Name);
}
}
TempData["Status"] = "Roles are updated as of <b>" + DateTime.Now.ToShortTimeString() + "</b>";
return View(user);
}
[HttpGet]
公共操作结果编辑(字符串用户ID)
{
返回视图(context.Users.FirstOrDefault(u=>u.Id==userId));
}
[HttpPost]
公共异步任务编辑(字符串[]checkRoles,字符串userID)
{
var UserManager=\u serviceProvider.GetRequiredService();
var rolemager=_serviceProvider.GetRequiredService();
var allRoles=rolemager.Roles.ToList();
var user=await UserManager.FindByIdAsync(userID);
var usersRoles=await UserManager.GetRolesAsync(用户);
//循环浏览角色
foreach(所有角色中的变量项)
{
bool wasChecked=false;
//选中的所有复选框
foreach(checkRoles中的var roleChecked)
{
如果(item.Name==roleChecked)
{
wasChecked=true;
}
}
//所有未选中的复选框
如果(wasChecked==false)
{
//如果用户具有角色,请将其删除
if(wait UserManager.IsInRoleAsync(user,item.Name))
{
等待UserManager.RemoveFromRoleAsync(用户、项、名称);
}
}
else//如果选中此复选框,则向用户添加角色
{
wait UserManager.AddToRoleAsync(user,item.Name);
}
}
TempData[“Status”]=“角色更新日期为“+DateTime.Now.toSortTimeString()+”;
返回视图(用户);
}
可能对我这样的新手有所帮助的是,AspNetUserRoles表有两列,UserId和RuleId关系。在我上面的代码中,一旦我获得了关于我要编辑的用户的所有信息,并从多到多获取了所有用户的角色,然后我就可以通过迭代来添加或删除一行。对于视图也是这样。我知道这些东西可以重构,但它正在按我们所说的那样做。我很乐意给那些o甚至对其进行了轻微的重构(但没有将其变成疯狂的科学家gobbly gook,恕我直言).不要使用
FormCollection
使用视图模型并与您的模型进行强绑定-例如,Oh man。我希望找到一个原因,说明为什么我所做的FormsCollection hack中没有任何内容。我正在升级到MVC 6的MVC 5代码确实看到表单集合,并且