我在MVC6中使用用户角色(使用EF7),我认为我只是缺少一些东西,但在用于定义用户角色的表单上,我在回发模型中没有得到任何内容到控制器
这是我的模特
public class UserRoleItem
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public IdentityUserRole<int> userRole { get; set; }
public bool HasRole { get; set; }
}
public class UsersRolesViewModel
{
public int UserId { get; set; }
public string FullName { get; internal set; }
public List<UserRoleItem> UserRoles;
}
这是视图
@model Skill.ViewModels.Manage.UsersRolesViewModel
<br />
<h3>Set Roles for user - @Model.FullName</h3>
<form asp-action="ChangeUsersRoles" >
<div class="form-horizontal">
<hr />
<input type="hidden" asp-for="UserId" />
@foreach (var userRole in Model.UserRoles)
{
<input type="hidden" asp-for="@userRole.Id" />
<div class="form-group">
<div class="inline-block col-md-8">
<span class="col-md-1" align="center">
<input type="checkbox" asp-for="@userRole.HasRole" />
</span>
<div class="col-md-7">
@userRole.Name (@userRole.Description)
</div>
</div>
</div>
}
<hr />
<div class="form-group">
<div class="col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
</form>
这是控制器
// GET: Users/ChangeUserRoles/5
public async Task<IActionResult> ChangeUserRoles(int? id)
{
if (id == null)
{
return HttpNotFound();
}
var model = new UsersRolesViewModel();
ApplicationUser appUser = await _context.ApplicationUsers.SingleAsync(m => m.Id == id);
if (appUser == null)
{
return HttpNotFound();
}
else
{
model.UserId = (int)id;
model.FullName = appUser.FullName;
var some = from r in _context.Roles
from ur in _context.UserRoles
.Where(inner => r.Id == inner.RoleId && inner.UserId == id)
.DefaultIfEmpty()
select new UserRoleItem
{
Id = (int)r.Id,
Name = r.Name,
Description = r.NormalizedName,
userRole = ur, // this is needed else it has a hissy fit
HasRole = (ur != null)
};
// get all of the Roles and then also link to the ones the user currently has
model.UserRoles = (some).ToList();
}
return View(model);
}
// POST: Users/ChangeUserRoles/5
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> ChangeUserRoles([Bind(include:"UserId,UserRoles")]UsersRolesViewModel userModel)
{
if (ModelState.IsValid)
{
// update based on the changes
// return RedirectToAction("Edit", new { userModel.UserId });
}
return View(userModel);
}
所以当我在Save上回复帖子时,UserRoles列表为空,所以我假设我在这里错过了一个显而易见的事情?
另一个小问题是EF Linq声明。如果我删除
userRole = ur,
来自Linq查询的Select部分的语句,系统有一个拟合,并说我的模式已过时(事实并非如此)。我认为这是由于以下语句我在测试外连接值
HasRole = (ur != null)
虽然这看起来非常合理,但如果在测试null之前使用了ur变量(或没有)
,则可以使用答案 0 :(得分:0)
输入这个问题后 - 我进一步调查了这个问题,发现我可以使用EditorTemplate做我需要的东西 所以我在Users View文件夹下创建了EditorTemplate文件夹,因为它是UsersController,然后添加了以下UserRoleItem.cshtml文件
@model UserRoleItem
<input type="hidden" asp-for="Id" />
<div class="form-group">
<div class="inline-block col-md-8">
<span class="col-md-1" align="center">
<input type="checkbox" asp-for="HasRole" />
</span>
<div class="col-md-7">
@Model.Name (@Model.Description)
</div>
</div>
</div>
然后我将视图(称为ChangeUsersRole.cshtml)更改为
@model Skill.ViewModels.Manage.UsersRolesViewModel
<br />
<h3>Set Roles for user - @Model.FullName</h3>
<hr />
<form asp-action="ChangeUsersRoles">
<div class="form-horizontal">
<input type="hidden" asp-for="UserId" />
@Html.EditorFor(m => m.UserRoles)
<hr />
<div class="form-group">
<div class="col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
</form>
另请注意:我尝试使用新格式
<input asp-for="UserRoles" />
而不是视图中的这一行
@Html.EditorFor(m => m.UserRoles)
但它没有按预期工作。也许我还在做错事 - 或者说这个功能还没有工作呢?