【问题标题】:ModelState.IsValid is false - But Which One - Easy WayModelState.IsValid 是假的 - 但哪一个 - 简单的方法
【发布时间】:2014-08-18 15:51:50
【问题描述】:

在 ASP.NET MVC 中,当我们使用一些数据调用 post 操作时,我们会检查 ModelState,以防出现一些验证错误,它会是 falst。对于一个大的输入用户信息表单,展开每个值并查看计数以查看哪个键(附加示例图像中的 9 个)有验证错误是很烦人的。想知道是否有人知道一种简单的方法来找出导致验证错误的元素。

【问题讨论】:

  • 这里的最佳答案应该可以帮助您stackoverflow.com/questions/2845852/…您可以使用 LINQ 查询轻松找到错误。
  • 嗯,您的表单中必须有验证消息,它将在其中显示。如果您只是为作为输入提供的属性显示错误,那么我建议在 html 帮助器的帮助下在页面顶部显示错误摘要。这样,与那里的属性无关的所有错误都将在那里显示。或者如果您希望它以编程方式查找,那么只需为此字典编写一个 linq 查询并将错误列表暂时存储在 temp 变量中。
  • 在不改变代码的简单方法中,暂时在你的视图上使用这个扩展......msdn.microsoft.com/en-us/library/…
  • 我实际上是在查看调试器点。我查看了@Jason 提供的链接,它为我提供了足够的信息。将问题保留一天,看看是否有人有其他想法。谢谢大家的cmets。

标签: asp.net-mvc c#-4.0 visual-studio-2012


【解决方案1】:

在 VS2015+ 中,您可以在即时窗口中使用 LINQ,这意味着您只需运行以下命令:

ModelState.SelectMany(
    x => x.Value.Errors, 
    (state, error) => $"{state.Key}:  {error.ErrorMessage}"
)

【讨论】:

    【解决方案2】:

    我建议写一个方法:

    namespace System.Web
    {
        using Mvc;
    
        public static class ModelStateExtensions
        {
            public static Tuple<string, string> GetFirstError(this ModelStateDictionary modelState)
            {
                if (modelState.IsValid)
                {
                    return null;
                }
    
                foreach (var key in modelState.Keys)
                {
                    if (modelState[key].Errors.Count != 0)
                    {
                        return new Tuple<string, string>(key, modelState[key].Errors[0].ErrorMessage);
                    }
                }
    
                return null;
            }
        }
    }
    

    然后在调试时打开即时窗口并输入:

    ModelState.GetFirstError()
    

    【讨论】:

    • 哇,不错,我试过了,效果很好。我喜欢这很简单,没有开销。只是 Web 层中的一种扩展方法,在需要时可以使用。谢谢。
    【解决方案3】:

    听起来您正在寻找调试器增强功能。我最近在 Visual Studio 画廊中看到了这个产品。

    http://visualstudiogallery.msdn.microsoft.com/16acdc63-c4f1-43a7-866a-67ff7022a0ac

    我与他们没有从属关系,也没有使用过它。它也是一个试用版,不知道完整的东西要花多少钱。

    【讨论】:

    • 我试过了,效果很好。给出一个带有过滤器的窗口,因此我们可以搜索 Count = 1 并找到相应的键。虽然这个工具很好,但它是付费的。除非在接下来的 30 天内我找到更多购买它的理由,否则我会使用另一种方法来解决这个不太常见的问题。感谢您的建议。
    【解决方案4】:

    如果您更专注于调试器方面,请尝试使用 OzCode 的试用版。它通过将常用的调试工具提示替换为它自己的、更强大的调试工具提示来增强 Visual Studio IDE。很难用文字来解释,看看他们的网站,他们在那里有一个功能库。

    我已经玩了几个星期了,它被证明是一个非常有价值的工具。您可以使用 OzCode 在调试器中查询数据。例如,您可以通过过滤 Values 集合来查询 ModelState 中的项目。

    【讨论】:

    • 谢谢 Jason,有时间我会试试这个工具的。目前打算使用crys建议的扩展方法。不过感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 2020-08-23
    • 2016-10-09
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 2011-11-13
    • 2014-06-19
    相关资源
    最近更新 更多