【问题标题】:How can I get the first error message from a list of possibly more than one?如何从可能不止一个的列表中获取第一条错误消息?
【发布时间】:2014-06-10 10:49:16
【问题描述】:

我收到以下格式的错误消息:

{
 "message":"The request is invalid.",
 "modelState":{
    "model.ConfirmPassword":["The password and confirmation password do not match."]
  }
}

{
 "message":"The request is invalid.",
 "modelState":{
    "model.Email":["The Email must be at least 10 characters long."],
    "model.ConfirmPassword":["The password and confirmation password do not match."]
  }
}

我知道如何获取模型状态,但如何获取第一个消息字段 每次该字段可能不同时的modelState?

  • 我首先希望得到消息:“密码和确认密码不匹配。”
  • 在第二种情况下,消息:“电子邮件必须至少有 10 个字符长。”

【问题讨论】:

  • 这里是从 JS 对象获取键列表的链接:stackoverflow.com/questions/3068534/…
  • “第一”是什么意思?像 modelState 这样的对象中的属性在 JavaScript 中没有固有的顺序。

标签: javascript modelstate


【解决方案1】:

您可以使用 Object.keys 或方法 hasOwnProperty

遍历所有对象属性
for (var k in modelState) {
    if (modelState.hasOwnProperty(k)) {               
        var error_message = modelState[k][0];
        // k => "model.Email"
        // error_message =>  "The Email must be at least 10 characters long."
    }
}

【讨论】:

  • 此解决方案忽略问题中给出的“第一条错误消息”约束。更重要的是,当找到正确的密钥时,它甚至不会取消循环——它只会继续遍历所有(可能)十亿条错误消息。它会在随机的“最后一个”错误上停止。准备好在 IE8、iPhone4 和 iPad 20 上查看不同的错误文本。
  • 问题是关于在 modelState 提供的任何键中获取第一条错误消息。无论字段 [key] 名称,每个键都可以包含多个特定字段的消息。该解决方案已经过探索和确认。
  • 如果您仔细阅读原始代码块之后的文字,您会发现自己错了。 我知道如何获取 modelState,但我如何获取 modelState 中的第一个消息字段,因为该字段每次都不同?
  • 您可以与作者讨论您的问题。对我来说,问题是从 { "PropertyName": ["foo", "bar", "foobar"] } 获取 "foo"。这是一个简单的解决方案。
【解决方案2】:

大多数最新的浏览器都支持Object.keys 方法

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

您可以使用它从您的 modelState 中获取一个数组,该数组将在每种情况下返回 ["model.Email", "model.ConfirmPassword", ... ]。

然后从该返回数组中获取第一项,并调用它,因此类似于:

var keys = modelState.keys;
var firstError = modelState[keys[0]];

(我还没有测试过这种语法,但它是类似的)

(请注意,“第一项”可能有点随意,我不确定它是否保证返回密钥的顺序,尽管在实践中我希望你会发现它非常可靠)

【讨论】:

    【解决方案3】:

    基于 JS 对象键本质上是无序的事实,我建议重构你的 modelState 响应(无论如何你都有数组作为值):

    var response = {
        "message":"The request is invalid.",
        "modelState": {
            "errors": ["Bad email", "Bad password"]
        }
    }
    console.log( response.message, response.modelState.errors[0] );
    

    【讨论】:

      【解决方案4】:

      V2: 基于 JS 对象键本质上是无序的事实,您可以添加定义的错误优先级顺序。

      var response = {
          "message":"The request is invalid.",
          "modelState":{
              "model.Email":["The Email must be at least 10 characters long."],
              "model.ConfirmPassword":["The password and confirmation password do not match."]
          }
      }
      
      var priorities = ["model.Email", "model.ConfirmPassword"];
      var selectedError = null,
      idx = 0;
      
      do {
          selectedError = response.modelState[ priorities[ idx ] ];
          selectedError = selectedError ? selectedError[0] : null;
          idx++;
      } while ( !selectedError && idx < priorities.length );
      
      console.log( selectedError || 'Unknown error'  );
      

      http://jsfiddle.net/A2dA9/

      【讨论】:

        猜你喜欢
        • 2013-09-30
        • 1970-01-01
        • 2017-06-16
        • 1970-01-01
        • 2017-04-17
        • 1970-01-01
        • 2012-06-04
        • 2014-12-20
        • 2021-01-19
        相关资源
        最近更新 更多