Создавайте роли с помощью интерфейса - PullRequest
0 голосов
/ 08 ноября 2018

Я недавно работаю с asp.net core 2 и пытаюсь добавить представление для создания ролей на веб-странице, поэтому мой метод выглядит примерно так:

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

ApplicationRoleModel модель

public class ApplicationRoleModel : ClaimsToRoleModel
    {
        public IEnumerable<ApplicationRole> RoleList { get; set; }
    }

ClaimsToRoleModel модель

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

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

Итак, я создаю вид как:

@page
@model Security.Dto.Models.ApplicationRoleModel
@{
    ViewData["Title"] = "Create New Role";
}

<h2>@ViewData["Title"]</h2>

<div class="row">
    <div class="col-md-4">
        <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">
                <label asp-for="Name">Name</label>
                <input asp-for="Name" class="form-control" />

            </div>
            <button type="submit" class="btn btn-default">Create</button>
        </form>
    </div>
</div>

@section Scripts {
    <partial name="_ValidationScriptsPartial" />
}

Но когда я пытаюсь построить проект, он возвращает

'ApplicationRoleModel' не содержит определения для 'Name' и no метод расширения «Имя», принимающий первый аргумент типа 'ApplicationRoleModel' может быть найдено (вы не используете директива или ссылка на сборку?)

Каким должен быть мой взгляд, чтобы реагировать на мои модели? Я действительно смущен там. Привет

1 Ответ

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

По вашему мнению, вы ссылались на несуществующее свойство формы, отсюда и ошибка.

В первой строке вашего представления вы объявили модель типа ApplicationRoleModel, а в своей форме вы объявили вход для свойства Name, которого нет в этой модели.

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

public class ApplicationRoleModel : ClaimsToRoleModel
{
    [BindNever] // BindNever is to avoid model-binding security issues
    public IEnumerable<ApplicationRole> RoleList { get; set; }

    [Required]
    [Display(Name="Name" )] // This will be displayed in the `<label asp-for>` element
    public String NewRoleName { get; }
}

В вашем cshtml:

<div class="form-group">
    <label asp-for="Name" />
    <input asp-for="Name" class="form-control" />
 </div>

Если вы хотите разрешить редактирование нескольких элементов, измените модель представления на List<T> вместо IEnumerable<T> и используйте цикл for( Int32 i = 0; i < list.Count; i++ ) (для этого нельзя использовать foreach), например так:

public class NewRoleViewModel
{
    //[Required] // no-longer required so that users can submit empty lists
    [Display(Name="Name" )]
    public String NewRoleName { get; set; }
}

public class ApplicationRoleModel : ClaimsToRoleModel
{
    [BindNever] // BindNever is to avoid model-binding security issues
    public IEnumerable<ApplicationRole> RoleList { get; set; }

    [Required]
    public List<NewRoleViewModel> NewRoles { get; } = new List<NewRoleViewModel>();
}

В вашем cshtml:

@for( Int32 i = 0; i < this.Model.NewRoles.Count; i++ ) {
    <div class="form-group">
        <label asp-for="NewRoles[i].Name" />
        <input asp-for="NewRoles[i].Name" class="form-control" />
    </div>
} 

Обратите внимание, что список NewRoles по умолчанию будет пустым, вам необходимо добавить несколько пустых записей в метод действия вашего контроллера:

public IActionResult Index()
{
    ApplicationRoleModel vm = new ApplicationRoleModel();
    vm.NewRoles.Add( new NewRoleViewModel() );
    vm.NewRoles.Add( new NewRoleViewModel() );
    vm.NewRoles.Add( new NewRoleViewModel() );

    return this.View( vm );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...