Использование RoleManager ApplicationRole для вставки новой роли - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть метод для добавления новых ролей, таких как:

  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);
                }
                return Ok();
            }
            catch (Exception e)
            {
                return BadRequest();
            }
        }

Итак, как вы можете видеть, я использую предложение foreach для доступа к модели с IEnumerable из ApplicationRole, например:

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

Итак, как вы можете видеть в foreach, я могу получить доступ к role.Name из RoleList (ApplicationRole), я проверил его с почтальоном, и он работает, он добавил новую роль успешно, теперь вместо почтальона я хочу создать представление для создания новой роли, поэтому Я пытаюсь:

@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">
                    <label asp-for="RoleList.Name">Role Name</label>
                    <input asp-for="RoleList.Name" class="form-control" />
                </div>

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

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

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

Итак, как я могу получить доступ к свойству Name ApplicationRole для назначения модели из вида? Привет

Примечание: я также пытаюсь получить к нему доступ, например:

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

Но я получаю:

Невозможно применить индексирование с помощью [] к выражению типа 'IEnumerable'

1 Ответ

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

Модель в вашем представлении IEnumerable<ApplicationRole>, но вы пытаетесь создать элементы управления для одного экземпляра ApplicationRole

Вы можете использовать List<ApplicationRole> вместо IEnumerable<ApplicationRole> в вашей модели и использовать jquery для добавления списков ролей, как показано ниже

Модель:

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

Вид:

@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="RoleList[0].Name" class="form-control items" />
</div>
<a href="#" id="add">Add another</a>//click to add
<br />
<button type="submit" class="btn btn-default">Create</button>

</form>

@section Scripts {
<script>
$(function () {

   $("#add").click(function (e) {
       e.preventDefault();
       var i = ($(".items").length);
       var n = '<input class="form-control items" name="RoleList[' + i + '].Name" />' 
       $("#item-list").append(n);
   });

});
</script>
}
...