首页 > 解决方案 > 将对象列表传递给控制器

问题描述

我有一个名为 CreateRoleViewModel 的 ViewModel,其中包含如下所示的项目。在视图中,我正在遍历权限列表并显示它们。我想要完成的是允许用户创建一个新角色并向该角色添加权限。除了权限之外,我已经能够成功地将所有数据传递给控制器​​。希望我不会让任何人感到困惑。我尝试使用 for 循环(它没有产生正确的结果)和一个 foreach 循环,它确实产生了正确的结果(意味着显示当前可用的所有权限)。我意识到我也会,很可能需要更新我的域模型的权限,以包括查看、修改等列。

创建视图模型

public class CreateRoleViewModel
{
    [Required]
    public string RoleName { get; set; }
    public string RoleDescription { get; set; }
    public List<Permissions> Permissions { get; set; }
    public bool AllowViewAccess { get; set; }
    public bool AllowModifyAccess { get; set; }
    public CreateRoleViewModel()
    {
        Permissions = new List<Permissions>();
    }
}

权限控制器

[Route("Administration/Permissions/CreateRole")]
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult CreateRole(CreateRoleViewModel newRole)
    {
        try
        {
            var test = newRole;
            return RedirectToAction(nameof(Index));
        }
        catch
        {
            return View();
        }
    }

看法

<form method="post" asp-action="CreateRole">

        <div class="form-group col-6" style="padding-left:0">
            <label asp-for="RoleName"></label>
            <input asp-for="RoleName" class="form-control" />
            <span asp-validation-for="RoleName" class="text-danger"></span>
        </div>
        <div class="form-group col-6" style="padding-left:0">
            <label asp-for="RoleDescription"></label>
            <input asp-for="RoleDescription" class="form-control" />                
        </div>
        <div class="form-group ">
            <h4>Permissions</h4>
            <div class="card">
                <div class="card-header">
                    <input type="checkbox" class="form-check-input p-2" id="selectAll">
                    <label class="form-check-label" for="selectAll">Select All<span style="font-weight:bold;font-style:italic;"> (This will allow read/write access to ALL selected items.)</span></label>
                </div>
            </div>
            <!--Permissions should go here-->
            <div class="card-body border">
                @foreach (var item in Model.Permissions)
                {
                <div class="row" style="border-radius:3px;border-top:2px solid gray;border-bottom:2px solid gray;padding:15px;">
                    <div class="col-8">
                        <input type="checkbox" class="form-check-input p-2" id="select">
                        <label class="form-check-label" for="select" style="font-weight:bold;">@item.PermissionName</label>
                        <p style="color:gray;">@item.PermissionDescription</p>
                    </div>
                    <div class="col-2">
                        <input type="checkbox" class="form-check-input p-2" id="readOnly" asp-for="AllowViewAccess">
                        <label class="form-check-label" for="readOnly">View</label>
                    </div>
                    <div class="col-2">
                        <input type="checkbox" class="form-check-input p-2" id="readWrite" asp-for="AllowModifyAccess">
                        <label class="form-check-label" for="readWrite">Modify</label>
                    </div>
                </div>
                }


            </div>
            <div asp-validation-summary="All" class="text-info"></div>
            <button style="background-color: #6987D5;color:white;" class="btn">Save</button>
            <button class="btn" style="background-color:lightgray;border:1px solid darkgray">Cancel</button>
        </div>
    </form>

标签: c#asp.net-coreasp.net-core-mvc

解决方案


从您的描述和查看代码来看,我认为您应该将“AllowViewAccess”和“AllowModifyAccess”放在 Permissions 类中,因为角色对不同的权限具有单独的“查看”或“修改”访问权限。根据您的代码,我举了一个例子:

模型:

public class CreateRoleViewModel
{
    [Required]
    public string RoleName { get; set; }
    public string RoleDescription { get; set; }
    public List<Permissions> Permissions { get; set; }

    public CreateRoleViewModel()
    {
        Permissions = new List<Permissions>();
    }
}

public class Permissions
{
    public string PermissionName { get; set; }
    public string PermissionDescription { get; set; }
    public bool AllowViewAccess { get; set; }
    public bool AllowModifyAccess { get; set; }
}

看法:

@model CreateRoleViewModel

@{ 
    var i = 0;
}

<form method="post" asp-action="CreateRole">

    <div class="form-group col-6" style="padding-left:0">
        <label asp-for="RoleName"></label>
        <input asp-for="RoleName" class="form-control" />
        <span asp-validation-for="RoleName" class="text-danger"></span>
    </div>
    <div class="form-group col-6" style="padding-left:0">
        <label asp-for="RoleDescription"></label>
        <input asp-for="RoleDescription" class="form-control" />
    </div>
    <div class="form-group ">
        <h4>Permissions</h4>
        <div class="card">
            <div class="card-header">
                <input type="checkbox" class="form-check-input p-2" id="selectAll">
                <label class="form-check-label" for="selectAll">Select All<span style="font-weight:bold;font-style:italic;"> (This will allow read/write access to ALL selected items.)</span></label>
            </div>
        </div>
        <!--Permissions should go here-->
        <div class="card-body border">
            @foreach (var item in Model.Permissions)
            {
                <div class="row" style="border-radius:3px;border-top:2px solid gray;border-bottom:2px solid gray;padding:15px;">
                    <div class="col-8">
                        <input type="checkbox" class="form-check-input p-2" id="select">
                        <input type="hidden" asp-for="@Model.Permissions[i].PermissionName">
                        <label class="form-check-label" for="select" style="font-weight:bold;">@item.PermissionName</label>
                        <p style="color:gray;">@item.PermissionDescription</p>
                        <input type="hidden" asp-for="@Model.Permissions[i].PermissionDescription">
                    </div>
                    <div class="col-2">
                        <input type="checkbox" class="form-check-input p-2" id="readOnly" asp-for="@Model.Permissions[i].AllowViewAccess">
                        <label class="form-check-label" for="readOnly">View</label>
                    </div>
                    <div class="col-2">
                        <input type="checkbox" class="form-check-input p-2" id="readWrite" asp-for="@Model.Permissions[i].AllowModifyAccess">
                        <label class="form-check-label" for="readWrite">Modify</label>
                    </div>
                </div>
                i++;
            }


        </div>
        <div asp-validation-summary="All" class="text-info"></div>
        <button style="background-color: #6987D5;color:white;" class="btn">Save</button>
        <button class="btn" style="background-color:lightgray;border:1px solid darkgray">Cancel</button>
    </div>
</form>

控制器:

public IActionResult Index()
{
    CreateRoleViewModel createRoleViewModel = new CreateRoleViewModel();
    return View(createRoleViewModel);
}

//[Route("Administration/Permissions/CreateRole")]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateRole(CreateRoleViewModel newRole)
{
    try
    {
        var test = newRole;
        return RedirectToAction(nameof(Index));
    }
    catch
    {
        return View();
    }
}

结果:

在此处输入图像描述


推荐阅读