Свойство сопоставления "роль" (внешний ключ в таблице User) с таблицей ролей do tNet Core - PullRequest
0 голосов
/ 23 февраля 2020

Я пытался создавать пользователей, назначая им роли. Свойство role находится в поле User as Required. Дело в том, что когда я сделал тег для извлечения данных из таблицы ролей, чтобы иметь возможность установить роль для пользователя, запрос вставки не работает. Таблица User имеет атрибут "roleId", но класс User имеет свойство "role" из класса Role.

Я добавлю код страницы бритвы UserCreate вместе с моделью, которую я использовал.

UserCreate.cs html:

@page
@model SprintOneBack.UserCreateModel

@{
    ViewData["Title"] = "UserCreate";
}

<h1>Create</h1>

<h4>User</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="User.Nom" class="control-label"></label>
                <input asp-for="User.Nom" class="form-control" />
                <span asp-validation-for="User.Nom" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="User.Email" class="control-label"></label>
                <input asp-for="User.Email" class="form-control" />
                <span asp-validation-for="User.Email" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="User.password" class="control-label"></label>
                <input asp-for="User.password" class="form-control" />
                <span asp-validation-for="User.password" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="User.role" class="control-label"></label>
                <select asp-for="User.role" class="form-control" asp-items="@(new SelectList(Model.displayRoles, "Id", "Label"))">
                    <option value="" selected disabled>-- select Role --</option>
                </select>
                @*<input asp-for="User.role.Label" class="form-control" />*@
                <span asp-validation-for="User.role" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-page="Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

UserCreateModel.cs html .cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using SprintOneBack.Model;

namespace SprintOneBack
{
    public class UserCreateModel : PageModel
    {
        private readonly ApplicationDbContext _context;

        public UserCreateModel(ApplicationDbContext context)
        {
            _context = context;
            displayRoles = _context.Role.ToList();
        }

        public IActionResult OnGet()
        {
            return Page();
        }

        public IEnumerable<Role> displayRoles { get; set; }

        public async Task OnGetRoles()
        {
            displayRoles = await _context.Role.ToListAsync();
        }

        [BindProperty]
        public User User { get; set; }

        public async Task<IActionResult> OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }

            _context.User.Add(User);
            await _context.SaveChangesAsync();

            return RedirectToPage("./UserIndex");
        }
    }
}

Класс пользователя:

public class User
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string Nom { get; set; }
    [Required]
    public string Email { get; set; }
    [Required]
    public string password { get; set; }
    [Required]
    public Role role { get; set; }
}

Класс роли:

public class Role
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string Label { get; set; }
}

Таблица пользователей вместе с таблицей ролей: enter image description here

Ответы [ 2 ]

0 голосов
/ 29 февраля 2020

Я добавил атрибут roleId в качестве целого числа и указал, что это столбец roleId в таблице User, и сохранил атрибут role (поэтому ef знает, что существует внешний ключ из таблицы ролей) и заново сгенерировал таблицы. И когда я регенерировал бритвенные страницы, у меня был красивый тег select html, чтобы перечислить все роли из базы данных для каждого пользователя.

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

public class User
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string Nom { get; set; }
    [Required]
    public string Email { get; set; }
    [Required]
    public string password { get; set; }
    [Column("roleId")]
    public int roleId { get; set; }
    public Role role { get; set; }
}

CreateUser.cs html:

<h4>User</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="User.Nom" class="control-label"></label>
                <input asp-for="User.Nom" class="form-control" />
                <span asp-validation-for="User.Nom" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="User.Email" class="control-label"></label>
                <input asp-for="User.Email" class="form-control" />
                <span asp-validation-for="User.Email" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="User.password" class="control-label"></label>
                <input asp-for="User.password" class="form-control" type="password" />
                <span asp-validation-for="User.password" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="User.roleId" class="control-label"></label>
                <select asp-for="User.roleId" class ="form-control" asp-items="ViewBag.roleId"></select>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>
0 голосов
/ 24 февраля 2020

Поле roleId - это внешний ключ, автоматически сгенерированный ef core. Это относится к ключевому полю в таблице ролей.

Вы можете изменить код на следующее:

UserCreate.cs html:

  <label asp-for="User.role" class="control-label"></label>
  <select asp-for="User.role.Id" class="form-control" asp-items="@(new SelectList(Model.displayRoles, "Id", "Label"))">
      <option value="" selected disabled>-- select Role --</option>
  </select>  

UserCreateModel.cs html .cs:

public async Task<IActionResult> OnPostAsync()
    {
        ModelState.Remove("User.Role.Label");
        if (!ModelState.IsValid)
        {
            return Page();
        }
        Role role = _context.Role.Find(User.role.Id);
        User.role = role;
        _context.User.Add(User);
        await _context.SaveChangesAsync();

        return RedirectToPage("./UserIndex");
    }
...