提问人:Michael Chen 提问时间:6/15/2023 更新时间:8/23/2023 访问量:155
ASP.NET Razor Pages 检查属性验证状态?
ASP.NET Razor Pages check property validation state?
问:
我正在尝试使用 ASP.NET 7.0 中的 Razor 页面编写网站,并且我正在尝试使用 bootstrap 5.1 表单在客户端上显示服务器端验证消息。
Bootstrap 提供类,并在验证字段后(在 post 请求失败后)将其应用于输入字段。但是,要有条件地显示消息,必须分别对输入字段进行标记。如何获取此信息?invalid-feedback
valid-feedback
is-invalid
is-valid
我知道我可以使用 或 从 html 帮助程序获取验证消息:ValidationMessageTagHelper
IHtmlHelper
<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)
答:
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
谢谢!不得不这样做有点烦人 - 有 ,但不是(或类似的东西),这似乎是有意义的事情。同时,您的解决方案非常简单且运行良好。棒!MvcViewOptions
HtmlHelperOptions.ValidationMessageElement
ValidationMessage(Valid|Invalid)ClassName
评论
NameFor