ASP.NET Razor Pages 检查属性验证状态?

ASP.NET Razor Pages check property validation state?

提问人:Michael Chen 提问时间:6/15/2023 更新时间:8/23/2023 访问量:155

问:

我正在尝试使用 ASP.NET 7.0 中的 Razor 页面编写网站,并且我正在尝试使用 bootstrap 5.1 表单在客户端上显示服务器端验证消息。

Bootstrap 提供类,并在验证字段后(在 post 请求失败后)将其应用于输入字段。但是,要有条件地显示消息,必须分别对输入字段进行标记。如何获取此信息?invalid-feedbackvalid-feedbackis-invalidis-valid

我知道我可以使用 或 从 html 帮助程序获取验证消息:ValidationMessageTagHelperIHtmlHelper

<label asp-for="Name" class="form-label"></label>
<input asp-for="Name" class="form-select @(IsValid ? "is-valid" : "is-invalid")" />
<div class="invalid-feedback">
    <!-- <span>@Html.ValidationMessageFor(i => i.Name)</span> -->
    <span asp-validation-for="Name"></span>
</div>

我想做一些类似于第二行的东西,我将类应用于输入。但是,我无法从模型中获取 ValidationState,尤其是当所有这些逻辑都在另一个 EditorTemplate 中时。到目前为止,我尝试使用与 ValidationMessageFor 用于检查该字典相同的方法获取该属性在 ModelStateDictionary 中使用的 Key,但它们在该类中不公开可用,并且我还尝试在 HtmlHelper 中查找允许我访问该验证状态的方法。

到目前为止,我尝试在 Html 帮助程序上使用扩展方法,但是在不知道确切键的情况下没有 ValidationState 方法,这在嵌套属性中很难:

Html.ViewContext.ModelState.GetValidationState(key)
C# asp.net 验证 Razor

评论

0赞 Michael Chen 6/15/2023
对不起,将 Stackoverflow 用作橡皮鸭,但我刚刚弄清楚了:Html 帮助程序不仅提供 IdFor 方法(不提供正确的模型状态键),还提供正确分配验证检查键的方法。NameFor

答:

2赞 Michael Chen 6/15/2023 #1

正如我的评论中所说,我认为该函数可以满足我的需求:NameFor

public static class HtmlExtensions {
    /// <inheritdoc cref="ModelStateDictionary.GetValidationState(string)"/>
    /// <param name="property">Property that provides the key.</param>
    public static ModelValidationState GetValidationState<TModel, TPropertyType>(this IHtmlHelper<TModel> helper, Expression<Func<TModel, TPropertyType>> property)
        => helper.ViewContext.ModelState.GetValidationState(helper.NameFor(property));

    public static string GetValidityClass<TModel, TPropertyType>(this IHtmlHelper<TModel> helper, Expression<Func<TModel, TPropertyType>> property)
        => helper.GetValidationState(property) switch {
            ModelValidationState.Invalid => "is-invalid",
            ModelValidationState.Valid => "is-valid",
            _ => string.Empty,
        };
}

现在,我可以使用这个扩展来应用这样的类:

<div class="col-md-6">
    <label asp-for="Name" class="form-label"></label>
    <input asp-for="Name" class="form-control @Html.GetValidityClass(i => i.Name)" />
    <div class="invalid-feedback"><span asp-validation-for="Name"></span></div>
</div>

评论

2赞 Tieson T. 8/23/2023
谢谢!不得不这样做有点烦人 - 有 ,但不是(或类似的东西),这似乎是有意义的事情。同时,您的解决方案非常简单且运行良好。棒!MvcViewOptionsHtmlHelperOptions.ValidationMessageElementValidationMessage(Valid|Invalid)ClassName