Моя проблема заключается в следующем: я создал представление, в котором я хочу иметь возможность удалять и добавлять новые роли идентификации. Для этого я создал две формы, которые вызывают два разных действия. Я создал большую модель, которая состоит из более мелких моделей, которые связаны формами с действиями. Все работает, как задумано, модели привязаны должным образом, данные есть, и правильные действия выполняются, как они должны.
Не поймите меня неправильно, я понимаю, что это отдельные формы, и я знаю, что они никогда не будут показывать подтверждающие сообщения одновременно, потому что одновременно может быть размещена только одна форма. Проблема заключается в том, что когда я нажимаю на кнопку отправить в форме CreateNewRole
, появляется сообщение проверки, но когда я нажимаю кнопку отправки на действии RemoveRoles
, я не получаю никаких сообщений проверки, и к html не применяются классы проверки элементы, есть обычный «field-validation-valid» и нет класса «field-validation-error», в то время как он прекрасно присутствует в CreateNewRole
.
Почему проверка работает в первой форме, а не во второй? Я не могу найти разницы в том, как я сделал эти две формы, я что-то не замечаю?
Когда я отлаживаю состояние модели действия RemoveRoles
, возникает ошибка, но каким-то образом представление не получает об этом информации.
View
@model Models.ViewModels.RolePanelViewModel
@using Extensions
<h2>Role Panel</h2>
<article>
<div class="admin-panel-flex-container">
<div class="form-container">
@using (Html.BeginForm("CreateNewRole", "Administrator"))
{
<div class="form-group">
@Html.LabelFor(l => l.NewRoleRolePanelViewModel.NewIdentityRole.Name)
@Html.TextBoxFor(t => t.NewRoleRolePanelViewModel.NewIdentityRole.Name)
@Html.ValidationMessageFor(t => t.NewRoleRolePanelViewModel.NewIdentityRole.Name)
<button type="submit">Dodaj role</button>
</div>
}
</div>
<div class="form-container">
@using (Html.BeginForm("RemoveRoles", "Administrator"))
{
<div class="form-group">
@Html.LabelFor(l => l.ListRolePanelViewModel.SelectedIdentityRoles)
@Html.ListBoxFor(l => l.ListRolePanelViewModel.SelectedIdentityRoles, @Model.ListRolePanelViewModel.IdentityRolesSelectListItems)
@Html.ValidationMessageFor(t => t.ListRolePanelViewModel.SelectedIdentityRoles)
<button type="submit">Skasuj wybrane</button>
</div>
}
</div>
</div>
</article>
Модель
public class RolePanelViewModel
{
public ListRolePanelViewModel ListRolePanelViewModel { get; set; }
public NewRoleRolePanelViewModel NewRoleRolePanelViewModel { get; set; }
}
public class ListRolePanelViewModel
{
public List<IdentityRoleDTO> IdentityRoles { get; set; }
public List<SelectListItem> IdentityRolesSelectListItems { get; set; }
[Required(ErrorMessage = "Należy wybrać przynajmniej jedną pozycję z listy")]
public List<string> SelectedIdentityRoles { get; set; }
}
public class NewRoleRolePanelViewModel
{
public IdentityRoleDTO NewIdentityRole { get; set; }
}
public class IdentityRoleDTO
{
public string Id { get; set; }
[Required(ErrorMessage = "Nowa rola musi mieć nazwę")]
[MinLength(5)]
public string Name { get; set; }
public List<IdentityUserRole> Users { get; set; }
}
Действия
public ActionResult OpenRolePanel()
{
var roles = _context.Roles.ToList();
var viewModel = new RolePanelViewModel
{
ListRolePanelViewModel = new ListRolePanelViewModel
{
IdentityRolesSelectListItems = GetSelectListItems(roles,
(a) => new SelectListItem {Value = a.Id.ToString(), Selected = false, Text = a.Name})
},
NewRoleRolePanelViewModel = new NewRoleRolePanelViewModel()
};
return View("RolePanel", viewModel);
}
[HttpPost]
public async Task<ActionResult> CreateNewRole(NewRoleRolePanelViewModel newRoleRolePanelViewModel)
{
if(!ModelState.IsValid)
{
var roles = _context.Roles.ToList();
var viewModel = new RolePanelViewModel
{
ListRolePanelViewModel = new ListRolePanelViewModel
{
IdentityRolesSelectListItems = GetSelectListItems(roles,
(a) => new SelectListItem { Value = a.Id.ToString(), Selected = false, Text = a.Name })
},
NewRoleRolePanelViewModel = newRoleRolePanelViewModel
};
return View("RolePanel", viewModel);
}
var roleStore = new RoleStore<IdentityRole>(new ApplicationDbContext());
var roleManager = new RoleManager<IdentityRole>(roleStore);
await roleManager.CreateAsync(new IdentityRole(newRoleRolePanelViewModel.NewIdentityRole.Name));
return View("RolePanel");
}
[HttpPost]
public ActionResult RemoveRoles(ListRolePanelViewModel listRolePanelViewModel)
{
if (!ModelState.IsValid)
{
var roles = _context.Roles.ToList();
var viewModel = new RolePanelViewModel
{
ListRolePanelViewModel = listRolePanelViewModel,
NewRoleRolePanelViewModel = new NewRoleRolePanelViewModel()
};
viewModel.ListRolePanelViewModel.IdentityRolesSelectListItems = GetSelectListItems(roles,
(a) => new SelectListItem {Value = a.Id.ToString(), Selected = false, Text = a.Name});
return View("RolePanel", viewModel);
}
return View("RolePanel");
}
Пользовательский метод, который может понадобиться, если вы хотите запустить код
private List<SelectListItem> GetSelectListItems<T>(List<T> dbSetResult, Func<T,SelectListItem> Func)
{
var result = new List<SelectListItem>();
foreach (var item in dbSetResult)
{
result.Add(Func(item));
}
return result;
}