C# 以这种方式操纵ModelState是一种编码错误吗?
我遇到了这样一种情况:我想在视图中使用C# 以这种方式操纵ModelState是一种编码错误吗?,c#,asp.net-mvc,modelstate,C#,Asp.net Mvc,Modelstate,我遇到了这样一种情况:我想在视图中使用Html.ValidationSummary()来显示一般错误消息。可能类似于“您输入的信息有问题。”,但没有得到出错的每件事的列表(根据DataAnnotations) 旁注:我在他们的视图和前面的ValidationSummary中找到了使用if(ViewContext.ViewData.ModelState.IsValid){…}的引用。至少可以说,我对这种方法没有什么印象 重要的是,ModelStateDictionary仍然包含每个有验证错误的模型
Html.ValidationSummary()
来显示一般错误消息。可能类似于“您输入的信息有问题。”
,但没有得到出错的每件事的列表(根据DataAnnotations)
旁注:我在他们的视图和前面的ValidationSummary
中找到了使用if(ViewContext.ViewData.ModelState.IsValid){…}
的引用。至少可以说,我对这种方法没有什么印象
重要的是,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);
}
}
}
}
正如预期的那样,Html.ValidationSummary
足够智能,可以抑制字典中错误消息为空的ModelStates
的Html结构;最后,我还会使用错误验证属性装饰文本字段,例如
这种特殊的溶液气味难闻吗
我发现有人使用
if(ViewContext.ViewData.ModelState.IsValid){…}
前面的验证总结。我对这一点印象不深
至少可以说,这是一种方法
为什么不呢?我认为这是一个合理的解决办法。您说需要一个特殊的用例来显示验证摘要,这是一个视图关注点。您不必操纵控制器中的任何东西,也不必为了实现这一点而与框架抗争
至于当前使用
static
helper类+方法的解决方案是否有效,我认为这比从razor检查ViewContext.ViewData.ModelState.IsValid更糟糕。我评论说,您应该下载验证摘要
HtmlHelper
的源代码,并研究如何对其进行重新配置以满足您的需要,这可能是您问题的最佳答案。基本上,您可以将前面提到的if
语句封装到一个自定义HtmlHelper
,这是一个放置代码以供查看的合适位置。您看过ValidationSummary HtmlHelper的源代码了吗?您可以使用/extend/copy-off来获取所需的内容,而无需修改ModelStateDictionary。这是一个公平的观点。我明天会看一看。终于有机会再好好看一看。“…是一个视图问题。”这是有道理的。非常感谢。
if (StuffWentWrong) {
this.ModelState.Empty();
this.ModelState.AddModelError("", "Something went wrong...");
}