C# 将对象列表传递给控制器

C# 将对象列表传递给控制器,c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,我有一个名为CreateRoleViewModel的ViewModel,其中包含如下所示的项。在视图上,我正在遍历权限列表并显示它们。我试图实现的是允许用户创建一个新角色并向该角色添加权限。我已经能够成功地将除权限之外的所有数据传递给控制器。希望我没有把任何人弄糊涂。我尝试使用for循环(没有产生正确的结果)和foreach循环,前者产生了正确的结果(意味着显示了当前可用的所有权限)。我意识到我很可能还需要更新我的域模型,以获得包括查看、修改等列的权限 CreateViewModel 查看 权

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

CreateViewModel

查看


权限
全选(这将允许对所有选定项目进行读/写访问。)
@foreach(Model.Permissions中的var项)
{
@item.PermissionName

@item.PermissionDescription

看法 修改 } 拯救 取消
根据您的描述和视图代码,我认为您应该将“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();
    }
}
结果:

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();
    }
}

根据您的描述和视图代码,我认为您应该将“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();
    }
}
结果:

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();
    }
}

看看这个:仅供参考,您不能使用foreach循环绑定到集合。这就是为什么它是空白的。上面的评论基本上就是你需要做的。@G\P,谢谢你的回复。我确实在搜索帮助,但显然我没有使用正确的措辞LOL.mathis1337,也谢谢你的输入。我有一个大脑屁,你的回答完全有道理。看看这个:你不能用foreach循环绑定到一个集合仅供参考。这就是为什么它是空白的。上面的评论基本上就是你需要做的。@G\P,谢谢你的回复。我确实在搜索帮助,但显然我没有使用正确的措辞LOL.mathis1337,也谢谢你的输入。我放了个脑屁,你的回答完全有道理。这是完美的,正是我想要的。非常感谢您出色的代码分解。这是完美的,也正是我想要的。非常感谢您出色的代码分解。