Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以这种方式操纵ModelState是一种编码错误吗?_C#_Asp.net Mvc_Modelstate - Fatal编程技术网

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...");
}