【问题标题】:ModelState.AddModelError but without the ErrorMessage (even default) - only highlight the fieldModelState.AddModelError 但没有 ErrorMessage (甚至是默认值) - 仅突出显示该字段
【发布时间】: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


【解决方案1】:

现在我发现了一个非常老套的解决方法,但效果出奇的好: 在相关的 Razor 页面中,我添加以下代码:

@{ 
    var isGeneralError = (ViewData.ModelState[string.Empty]?.Errors?.Any()).GetValueOrDefault(false);
}

然后对于我想要突出显示的每个输入,我只需手动设置 CSS 类:

@Html.TextBoxFor(m => m.Login, new { @class = isGeneralError ? HtmlHelper.ValidationInputCssClassName : null })
@Html.PasswordFor(m => m.Password, new { @class = isGeneralError ? HtmlHelper.ValidationInputCssClassName : null })

这样我只是保持ValidationMessageFor 不变,也就是“已验证”状态,所以它们不会收到任何消息,因为我根本没有使用 AddModelError 操作它们。

我仍然认为这不是一个完美的解决方案,但它仍然比其他任何解决方案都要好。

有趣的是,只要您对字段执行任何操作,客户端验证就会启动,覆盖此 hack,这实际上是有道理的(至少对我而言)。

【讨论】:

    猜你喜欢
    • 2014-08-15
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2012-09-25
    • 2018-03-19
    • 2014-11-09
    • 2015-07-07
    • 2019-11-22
    相关资源
    最近更新 更多