0
我做用戶角色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);
}
所以,當我得到這個職位,回到保存,該名單的UserRole爲空,所以我想我只是缺少一個顯而易見的事情嗎?
也是另一個小問題是EF Linq的語句。如果我從Linq查詢的Select部分中刪除
userRole = ur,
聲明,那麼系統就會適合並說我的模式已過期(不是)。我認爲這是由於下面的語句,我正在測試外連接值
HasRole = (ur != null)
儘管這似乎是完全合理的,如果烏拉圭回合變量之前測試零使用(或不)的作品
您不能使用'foreach'循環來生成表單控件集合(如果你檢查HTML,你會看到你輸入的所有有需要你的模型沒有任何關係一樣'name'屬性)。使用'for'環或'EditorTemplate'爲'UserRoleItem'產生name'與索引屬性正確的'。對於使用'for'環的例子,請參見[此答案](http://stackoverflow.com/questions/29542107/pass-list-of-checkboxes-into-view-and-pull-out-ienumerable/29554416# 29554416) –
謝謝斯蒂芬。我走進這個問題後,我居然改變了代碼使用EditorTemplates,然後正確生成數據的陣列。也許我應該爲後代上傳解決方案? –
添加你自己的答案,並接受它關閉此:) –