0

我遇到了一种情况,我想Html.ValidationSummary()在我的视图中使用它来显示一般错误消息。也许类似"There was a problem with the information you entered."但没有得到每件出错的事情的列表(根据 DataAnnotations)。

旁注:我发现人们if(ViewContext.ViewData.ModelState.IsValid){ ... }在他们的观点和上述观点中都使用了参考资料ValidationSummary。至少可以说,我对这种方法并没有留下深刻的印象。

重要的是,ModelStateDictionary仍然包含每个具有验证错误的模型元素的键(以便Html.EditorFor等人编写正确的 css 类。)

我最终得到并且似乎有效的是:

public static class ModelStateHelpers
{
    public static void Empty(this ModelStateDictionary @this)
    {
        foreach (KeyValuePair<string, ModelState> state in @this)
        {
            if (state.Value.Errors.Any())
            {
                state.Value.Errors.Clear();
                state.Value.Errors.Add(String.Empty);
            }
        }
    }
}

在我的课堂上紧随其后:

if (StuffWentWrong) {
    this.ModelState.Empty();
    this.ModelState.AddModelError("", "Something went wrong...");
}

正如预期的那样,Html.ValidationSummary它足够聪明,可以ModelStates在错误消息为空白的字典中抑制 html 结构;最后我还得到了带有错误验证属性的文本字段,例如<input class="input-validation-error text-box single-line" data-val="true" data-val-required="The User Name field is required." id="UserName" name="UserName" type="text" value="" />

这种特殊的解决方案闻起来难闻吗?

4

1 回答 1

1

我发现人们 if(ViewContext.ViewData.ModelState.IsValid){ ... }在他们的观点中使用的参考资料和前面的 ValidationSummary 完全一致。至少可以说,我对这种方法并没有留下深刻的印象。

为什么不?我认为这是一个合理的解决方案。你说你想要一个显示验证摘要的特殊用例,这是一个视图关注点。您不必在控制器中操作任何东西或以其他方式对抗框架来完成此操作。

至于您当前的解决方案是否使用static辅助类+方法,我认为这比ViewContext.ViewData.ModelState.IsValid从剃刀检查更糟糕。我评论说您应该下载源代码ValidationSummary HtmlHelper并考虑对其进行重组以满足您的需求,这可能是您问题的最佳答案。您基本上可以将上述if语句封装到 customHtmlHelper中,这是放置视图问题代码的合适位置。

于 2012-07-22T09:25:24.080 回答