#c# #asp.net-core #razor-pages #ef-core-2.0
#c# #asp.net-core #razor-страницы #ef-core-2.0
Вопрос:
Я создал свою пользовательскую модель с помощью Razor Pages, и на странице создания я хочу вставить роль пользователя в таблицу соединений UserRoles.
это моя модель
[Table("Users")]
public class User
{
public User()
{
IsActivo = true;
}
public int Id { get; set; }
[Required]
[Display(Prompt = "Username")]
public string Username { get; set; }
[Display(Name = "Último Acesso")]
public DateTime? DataSessao { get; set; }
[Display(Name = "Activo")]
public bool IsActivo { get; set; }
public Colaborador Colaborador { get; set; }
public ICollection<UserRoles> UserRoles { get; set; }
}
и это модель создания
public class CreateModel : PageModel
{
private readonly HutIS.Models.HutISContext _context;
public CreateModel(HutISContext context)
{
_context = context;
}
public IActionResult OnGet()
{
DepartamentosOptions = _context.Departamento.Select(d =>
new SelectListItem
{
Value = d.Id.ToString(),
Text = d.Nome
}).ToList();
RolesOptions = _context.Roles.Select(d =>
new SelectListItem
{
Value = d.Id.ToString(),
Text = d.Type
}).ToList();
return Page();
}
[BindProperty]
public User User { get; set; }
public List<SelectListItem> DepartamentosOptions { get; set; }
public List<SelectListItem> RolesOptions { get; set; }
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
_context.User.Add(User);
await _context.SaveChangesAsync();
return RedirectToPage("./Index");
}
}
в html
<div class="form-group">
<label asp-for="User.UserRoles" class="control-label"></label>
<select asp-for="User.UserRoles" asp-items="Model.RolesOptions" class="form-control form-control-sm">
<option value="">Selecione um Departamento...</option>
</select>
<span asp-validation-for="User.UserRoles" class="text-danger"></span>
</div>
Я не совсем уверен, как я могу это сделать, конечно, я получаю исключение здесь, но как я могу привязать пользовательские роли, если это коллекция в User?
Редактировать
Я решил проблему исключения, это было связано со свойствами модели. Проблема сейчас в том, что в таблицу пользовательских ролей ничего не вставлено, я не совсем уверен, как это сделать, поскольку у пользователя нет свойства навигации к пользовательским ролям, в отличие от отделов.
как вы можете видеть, отношения правильные
Комментарии:
1. с какой проблемой / исключением вы столкнулись?
2. Обновленный пост, исключение устранено, но ничего не вставлено
3. кажется, что во внешнем интерфейсе вы должны назначать существующие пользовательские роли пользователю, где логика, которая может создавать новые пользовательские роли?
4. Это на другой странице, роль модели была создана с использованием razor CRUD. Я знаю, что мог бы сделать это отдельно, но я подумал, что можно назначить роль пользователю при создании user. Роли уже созданы.
5. Я отредактировал вопрос, чтобы отразить, что это действительно основной вопрос EF, а не ASP.Net . Вам необходимо явно обновить отношение ролей, это не произойдет бесплатно. Смотрите learn.microsoft.com/en-us/ef/core/saving/related-data для получения дополнительной информации
Ответ №1:
Для <select multiple="multiple" asp-for="User.RoleIds" asp-items="Model.RolesOptions" class="form-control form-control-sm">
того, чтобы вместо объекта роли было отправлено значение RoleId, вам необходимо определить, public ICollection<int> UserRoleIds { get; set; }
чтобы принимать идентификаторы ролей.
Выполните следующие действия:
-
Определите ViewModel с помощью
UserRoleIds
public class UserVM { public UserVM() { IsActivo = true; } public int Id { get; set; } [Required] [Display(Prompt = "Username")] public string Username { get; set; } [Display(Name = "Último Acesso")] public DateTime? DataSessao { get; set; } [Display(Name = "Activo")] public bool IsActivo { get; set; } public ICollection<int> RoleIds { get; set; } }
-
Модель Razor
public class CreateModel : PageModel { private readonly TestRazorContext _context; public CreateModel(TestRazorContext context) { _context = context; } public IActionResult OnGet() { RolesOptions = _context.Role.Select(d => new SelectListItem { Value = d.Id.ToString(), Text = d.Type }).ToList(); return Page(); } [BindProperty] public UserVM User { get; set; } public List<SelectListItem> RolesOptions { get; set; } public async Task<IActionResult> OnPostAsync() { if (!ModelState.IsValid) { return Page(); } //create user var user = new User { Username = User.Username, //rest properties }; _context.User.Add(user); await _context.SaveChangesAsync(); //set user role var userRoles = new List<UserRoles>(); foreach (var roleId in User.RoleIds) { userRoles.Add(new UserRoles { UserId = user.Id, RoleId = roleId }); } _context.UserRole.AddRange(userRoles); await _context.SaveChangesAsync(); return RedirectToPage("./Index"); } }
-
Razor View
<form method="post"> <div class="form-group"> <label asp-for="User.Username" class="control-label"></label> <input asp-for="User.Username" /> </div> <div class="form-group"> <label asp-for="User.RoleIds" class="control-label"></label> <select multiple="multiple" asp-for="User.RoleIds" asp-items="Model.RolesOptions" class="form-control form-control-sm"> <option value="">Selecione um Departamento...</option> </select> <span asp-validation-for="User.RoleIds" class="text-danger"></span> </div> <input type="submit" value="Submit"/> </form>