Не сохраняйте значение в дополнительном поле в IdentityRole - PullRequest
0 голосов
/ 14 февраля 2019

В IdentityFramework я добавляю новое поле для своей базы данных стандартная таблица Роль (Описание), enter image description here

Когда я добавляю новую роль, я хочу получить описание для этойРоль.

Я создаю cshtml-файл

@using (Html.BeginForm("CreateRole", "Role", FormMethod.Post))
{
@Html.AntiForgeryToken()
<div id="create-role-box">
    @Html.ValidationSummary(false)

    <div class="form-group">
        <label class="create-role-color">Название роли:</label>
        @Html.TextBoxFor(x => x.Name, new { @class = "input-form-create-role create-role-color" })
        @Html.ValidationMessageFor(x => x.Name)
    </div>

    <div class="form-group">
        <label class="create-role-color">Описание роли:</label>
        @Html.TextBoxFor(x => x.Description, new { @class = "input-form-create-role create-role-color" })
        @Html.ValidationMessageFor(x => x.Description)
    </div>

    <div class="form-group" style="margin: 22px 0px 0px 0px;">
        <button type="submit" class="button-create-role">Добавить</button>

        @Html.ActionLink("Отмена", "Index", null, new { @class = "button-cancel" })
    </div>
</div>

}

пост-запрос в контроллере

 public async Task<ActionResult> CreateRole([Required]string name, string description)
    {
        if (ModelState.IsValid)
        {
            IdentityResult result = await roleManager.CreateRoleAsync(name, description);

            if (result.Succeeded)
            {
                return RedirectToAction("Index");
            }
            else
            {
                AddErrorsFromResult(result);
            }
        }
        return View(name);
    }

метод CreateRoleAsync(name, description);, который я описываю врепозиторий

 public async Task<IdentityResult> CreateRoleAsync(string name, string description)
    {
        IdentityResult result = await userRole.CreateAsync(new UserRole(name, description));
        return result;
    }

и моя UserRole модель

public class UserRole : IdentityRole
{
    public UserRole(string name, string description) : base(name)
    {
        description = Description;
    }

    public string Description { get; set; }
}

и, если это необходимо, мой контекст

public class IdentityUserContext : IdentityDbContext<UserModel>
{
    public IdentityUserContext() : base("UserIdentityDbContext")
    {

    }
    // creating method realize by ninject in Ninject.Web.Common.cs WebUI->App_Start
}

проблема в том, что description неНе сохраняйте в базе данных, problem,

- это ноль, но метод принимает значение description,, почему идентификатор не сохраняется в базе данных.

1 Ответ

0 голосов
/ 14 февраля 2019

Сначала переименуйте ваш UserRole класс в ApplicationRole следующим образом, потому что UserRole сбивает с толку.UserRole должно быть названо для таблицы объединения пользователя и роли многие ко многим.

public class ApplicationRole : IdentityRole
{
    public ApplicationRole(string name) : base(name){}

    public string Description { get; set; }
}

Теперь создайте RoleViewModel следующим образом:

public class RoleViewModel
{
    public string Id { get; set; }
    [Required(AllowEmptyStrings = false)]
    [Display(Name = "RoleName")]
    public string Name { get; set; }
    public string Description { get; set; }
}

Тогда ваш Createview:

@model Domain.ViewModels.RoleViewModel

@using (Html.BeginForm())
{
    // Your input fields and submit button here
}

Теперь напишите свой CreateRole Post метод следующим образом:

[HttpPost]
public async Task<ActionResult> CreateRole(RoleViewModel roleViewModel)
{
    if (ModelState.IsValid)
    {
        var role = new ApplicationRole(roleViewModel.Name);
        role.Description = roleViewModel.Description; // <--- Here you have to assign the `Description` value

        var roleresult = await RoleManager.CreateAsync(role);
        if (!roleresult.Succeeded)
        {
            ModelState.AddModelError("", roleresult.Errors.First());
            return View();
        }
        return RedirectToAction("Index");
    }
    return View();
}

Теперь все будет хорошо!


Если вы хотитесоздайте роль из вашего метода репозитория, затем напишите ваш CreateRoleAsync метод репозитория следующим образом:

public async Task<IdentityResult> CreateRoleAsync(ApplicationRole applicationRole)
{
    IdentityResult result = await userRole.CreateAsync(applicationRole);
    return result;
}

Затем вызовите его в методе контроллера следующим образом:

[HttpPost]
public async Task<ActionResult> CreateRole(RoleViewModel roleViewModel)
{
    if (ModelState.IsValid)
    {
        var role = new ApplicationRole(roleViewModel.Name);
        role.Description = roleViewModel.Description; // <--- Here you have assign the Description value

        IdentityResult result = await roleManager.CreateRoleAsync(role); // <-- call your repository method here.

        if (!roleresult.Succeeded)
        {
            ModelState.AddModelError("", roleresult.Errors.First());
            return View();
        }
        return RedirectToAction("Index");
    }
    return View();
}
...