c# - ASP.NET MVC 表单之一没有收到验证消息
问题描述
我的问题是:我创建了一个视图,希望能够在其中删除和添加新的身份角色。为此,我创建了两种调用两种不同操作的表单。我创建了一个大模型,它由较小的模型组成,这些模型由表单绑定到动作。一切都按预期工作,模型被正确绑定,数据在那里并且正确的动作被执行。
不要误会我的意思,我知道这些是单独的表单,我知道它们永远不会同时显示验证消息,因为一次只能发布一个表单。问题是,当我在CreateNewRole
表单上单击提交时,验证消息就在那里,但是当我在RemoveRoles
操作上单击提交时,我没有收到任何验证消息并且没有将验证类应用于 html 元素,通常"field-validation-valid" 并且没有 "field-validation-error" 类,而它完美地存在于CreateNewRole
.
为什么验证适用于第一个表单而不适用于第二个表单?我找不到这两种表格的制作方式有什么不同,我没有注意到什么吗?
当我调试RemoveRoles
动作的模型状态时,错误就在那里,但不知何故,视图没有得到通知。
看法
@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;
}
解决方案
推荐阅读
- java - 在索引处查找字符串数组中元素的子字符串
- python - 查看 conda 交易的历史记录?
- excel - 这个 vba 代码需要很长时间来复制和粘贴
- jquery - 使 Canceled Droppable 元素再次 Droppable
- laravel - 来自 Drupal 时了解 Laravel 中的页面?
- java - 如何将由字段确定的参数列表添加到单个“if”通用语句中?
- angular - 角度插值奇怪的行为
- python - 如何从输入和输出列表中找到函数 f?
- javascript - 将 setState 与来自父元素的道具一起使用
- javascript - Jquery - 附加在html中显示双引号