Сопоставление вложенных моделей в основных видах asp.net - PullRequest
0 голосов
/ 09 ноября 2018

Я хочу создать роли с соответствующими утверждениями в asp.net core 2+, поэтому я создаю вид, подобный:

@page
@model Security.Dto.Models.ApplicationRoleModel

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

    <h4>Create new Role</h4>
    <hr />
    <div asp-validation-summary="All" class="text-danger"></div>
    <div class="form-group" id="item-list">
        <label>Role Name</label>
        <input asp-for="RoleClaimList[0].Role.Name" class="form-control roles" />
    </div>
    <a href="#" id="add">Add another</a>


    <div class="form-group" id="claim-list">
        <label>Claim Type</label>
        <input asp-for="RoleClaimList[0].ClaimList[0].Type" class="form-control " />
        <label>Claim Value</label>
        <input asp-for="RoleClaimList[0].ClaimList[0].Value" class="form-control claims" />
    </div>
    <br />
    <button type="submit" class="btn btn-default">Create</button>

</form>

@section Scripts {
    <script>
        $(function () {
            $("#add").click(function (e) {
                e.preventDefault();
                var i = ($(".roles").length);
                var n = '<label>Role Name</label><input class="form-control roles" name="RoleClaimList[' + i + '].Role.Name" />'
                $("#item-list").append(n);
            });

        });
    </script>
}

Контроллер:

public async Task<IActionResult> CreateRole(ApplicationRoleModel model)
        {
            try
            {
                foreach (var item in model.RoleClaimList)
                {
                    var roleExists = await _roleManager.RoleExistsAsync(item.Role.Name);
                    if (roleExists) continue;
                    var createRole = _roleManager.CreateAsync(item.Role);
                    foreach (var claim in item.ClaimList)
                    {
                        await _roleManager.AddClaimAsync(item.Role, claim);
                    }
                }
                return Ok();
            }
            catch (Exception e)
            {
                return BadRequest();
            }
        }

ApplicationRoleModel:

public class ApplicationRoleModel 
    {
        public List<RoleClaimModel> RoleClaimList { get; set; }

    }

RoleClaimModel:

 public class ClaimsToRoleModel
    {
        public List<RoleClaimModel> RoleClaimList { get; set; }
    }

    public class RoleClaimModel
    {
        public ApplicationRole Role { get; set; }
        public List<Claim> ClaimList { get; set; }
    }

Поэтому, когда я запускаю и отлаживаю его, Role приходит правильно, но ClaimList всегда считает 0 или приходит ноль

enter image description here

Кто-то смотрит, что я делаю не так? Как правильно отобразить модель свойства ClaimList из вида?

Привет

1 Ответ

0 голосов
/ 10 ноября 2018

Ваша проблема вызвана тем, что класс Claim не имеет конструктора , который принимает 0 параметров , поэтому, когда каркас пытается создать новый, он не может, так что вы получите пустой или нулевой объект.

Чтобы решить эту проблему, вам нужно использовать свой собственный класс в вашей иерархии:

public class CustomClaim
{
    public string Type { get; set; }
    public string Value { get; set; }
}

public class RoleClaimModel
{
    public ApplicationRole Role { get; set; }
    public List<CustomClaim> ClaimList { get; set; }
}

Теперь фреймворк может создать CustomClaim и сериализовать его в ваш API. В вашем контроллере вы можете перевести ваш CustomClaim в .NET Claim и передать его вашему _roleManager:

public async Task<IActionResult> CreateRole(ApplicationRoleModel model)
{
    try
    {
        foreach (var item in model.RoleClaimList)
        {
            var roleExists = await _roleManager.RoleExistsAsync(item.Role.Name);
            if (roleExists) continue;
            var createRole = _roleManager.CreateAsync(item.Role);
            foreach (var claim in item.ClaimList)
            {
                var c = new System.Security.Claims.Claim(claim.Type, claim.Value);

                await _roleManager.AddClaimAsync(item.Role, c);
            }
        }
        return Ok();
    }
    catch (Exception e)
    {
        return BadRequest();
    }
}
...