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

wi3ka0sx  于 2023-06-25  发布在  .NET
关注(0)|答案(1)|浏览(106)

我正在尝试用ASP.NET 7.0中的Razor页面编写一个网站,我正在尝试使用bootstrap 5.1表单在客户端显示服务器端验证消息。
Bootstrap提供了invalid-feedbackvalid-feedback类,一旦字段被验证(在一个不成功的post请求之后),它们就应用于输入字段。然而,要有条件地显示消息,输入字段必须分别标记为is-invalidis-valid。我如何获得这些信息?
我知道我可以使用ValidationMessageTagHelperIHtmlHelper从html助手中获取验证消息:

<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>

我想做一个类似于第二行的东西,在那里我将类应用到输入。但是,我无法从Model中获取ValidationState,特别是当所有这些逻辑都在另一个EditorTemplate中时。到目前为止,我尝试使用ValidationMessageFor检查该字典时使用的相同方法获取该属性在ModelStateDictionary中使用的Key,但它们在该类中不是公开可用的,我还尝试在HtmlHelper中找到给予我访问该验证状态的方法。
到目前为止,我尝试在Html帮助器上使用扩展方法,但在不知道确切键的情况下没有ValidationState方法,这在嵌套属性中很困难:

Html.ViewContext.ModelState.GetValidationState(key)
ycggw6v2

ycggw6v21#

正如我在评论中所看到的,我认为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>

相关问题