【发布时间】:2021-01-04 02:19:38
【问题描述】:
考虑一个简单的 Razor 页面:
@using (Html.BeginForm("Login", "Account"))
{
@Html.ValidationSummary(true)
<br />
@Html.TextBoxFor(m => m.Login)
<br />
@Html.ValidationMessageFor(m => m.Login)
<br />
@Html.PasswordFor(m => m.Password)
<br />
@Html.ValidationMessageFor(m => m.Password)
}
还有这个模型:
public class LoginForm
{
[Required(ErrorMessage = "Please input the login")]
public string Login { get; set; }
[Required(ErrorMessage = "Please input the password")]
public string Password { get; set; }
}
现在,在控制器中检查登录时,我会这样做(因为登录失败与单独的登录名或密码无关):
if (loginFailed)
{
ModelState.AddModelError(string.Empty, "The specified login and password pair wasn't valid");
}
但是我如何也将登录和密码字段标记为无效(input-validation-error CSS 类)但不设置错误消息?
当我做类似的事情时:
ModelState.AddModelError(nameof(form.Login), string.Empty);
ModelState.AddModelError(nameof(form.Password), string.Empty);
我最终收到错误消息说
'somelogin' 值无效
和
值'somepassword'无效
对于这两个字段,除了
指定的登录名和密码对无效
现在,我可以像这样在 Startup.cs 中覆盖此行为:
services.AddControllersWithViews().AddMvcOptions(mopt => mopt.ModelBindingMessageProvider.SetValueIsInvalidAccessor(_ => string.Empty))
但这会覆盖全局所有内容,如果验证与这种情况无关,我会丢失消息。
有什么解决方法吗?
【问题讨论】:
-
只需删除 ValidationMessageFor 并替换为一个 ValidationMessage(string.Empty)
-
我仍然需要它进行其他验证(即Required验证)
-
使用空格代替string.Empty
-
这是我遇到的一种解决方法 - 空格或“\n”。但这似乎仍然更像是一种 hack,而不是实际的解决方案?...
-
另一个技巧是如果超过评估消息,这样当模型状态设置为字符串空时,您根本不会呈现验证器。
标签: c# asp.net-core