时间:2016-01-26 21:08:40

标签: entity-framework model-view-controller asp.net-core checkboxlist

我在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变量(或没有)

,则可以使用

1 个答案:

答案 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)

但它没有按预期工作。也许我还在做错事 - 或者说这个功能还没有工作呢?