我通过创建 2 个方法解决了这个问题。
public static bool HasErrorFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
if (expression == null)
throw new ArgumentNullException("expression");
string modelName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression));
if (!htmlHelper.ViewData.ModelState.ContainsKey(modelName))
return false;
ModelState modelState = htmlHelper.ViewData.ModelState[modelName];
return modelState.Errors.Count > 0;
}
public static MvcHtmlString GetErrorMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
if (expression == null)
throw new ArgumentNullException("expression");
string modelName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression));
if (!htmlHelper.ViewData.ModelState.ContainsKey(modelName))
return new MvcHtmlString(null);
ModelState modelState = htmlHelper.ViewData.ModelState[modelName];
if (modelState.Errors.Count > 0)
{
return new MvcHtmlString(modelState.Errors.FirstOrDefault().ErrorMessage);
}
return new MvcHtmlString(null);
}
以及如何使用它
<div class="row">
<div class="six columns">
@Html.TextBoxFor(model => model.Username, new { placeholder = Html.GetDisplayFor(model => model.Username) })
@if (Html.HasErrorFor(model => model.Username))
{
<small class="error">@Html.GetErrorMessageFor(model => model.Username)</small>
}
</div>
</div>