Mer*_*nzo 14 validation asp.net-mvc-3
我可以看到我ModelState.Values[x].Errors正确填充了单个属性的两个验证错误.
如果我@Html.ValidationSummary()在我的视图中使用a ,它会正确显示两个错误....尽管在页面的顶部,而不是在有问题的输入旁边.
使用仅@Html.ValidationMessageFor(model => model.MyProperty)显示该属性的第一个错误!
如何在适当的输入旁边显示两个错误?
Dav*_*A-W 12
一种解决方案是在HtmlHelper上实现自己的扩展方法,该方法执行与默认ValidationMessageFor行为不同的操作.下面的示例@ Html.ValidationMessagesFor方法将连接在服务器端验证期间(仅)添加到ModelState的多个错误消息.
public static MvcHtmlString ValidationMessagesFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null)
{
var propertyName = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).PropertyName;
var modelState = htmlHelper.ViewData.ModelState;
// If we have multiple (server-side) validation errors, collect and present them.
if (modelState.ContainsKey(propertyName) && modelState[propertyName].Errors.Count > 1)
{
var msgs = new StringBuilder();
foreach (ModelError error in modelState[propertyName].Errors)
{
msgs.AppendLine(error.ErrorMessage);
}
// Return standard ValidationMessageFor, overriding the message with our concatenated list of messages.
return htmlHelper.ValidationMessageFor(expression, msgs.ToString(), htmlAttributes as IDictionary<string, object> ?? htmlAttributes);
}
// Revert to default behaviour.
return htmlHelper.ValidationMessageFor(expression, null, htmlAttributes as IDictionary<string, object> ?? htmlAttributes);
}
Run Code Online (Sandbox Code Playgroud)
如果您要在属于模型的集合中应用自定义业务验证(例如,交叉检查总计),或者将模型作为整体检查,则此功能非常有用.
使用此示例,其中Order.LineItems的集合在服务器端验证:
@using MyHtmlHelperExtensions // namespace containing ValidationMessagesFor
@using (Html.BeginForm())
{
@Html.LabelFor(m => m.LineItems)
<ul>
@Html.EditorFor(m => m.LineItems)
</ul>
@Html.ValidationMessagesFor(m => m.LineItems)
}
Run Code Online (Sandbox Code Playgroud)
小智 5
Dave AW提供的答案本质上是正确的,但并非在所有情况下都有效。为了获得正确的属性名称,MVC 3的源代码使用:
var propertyName = ExpressionHelper.GetExpressionText(expression);
Run Code Online (Sandbox Code Playgroud)
这会照顾表单数据中的所有前缀
| 归档时间: |
|
| 查看次数: |
7766 次 |
| 最近记录: |