2011-04-12 45 views
1

我的Linq-fu不足以将以下内容翻译为希望的一行或两行。Linq - 如何将此代码转换为linq

var errors = new List<string>(); 
foreach (var key in ModelState.Keys) 
{ 
    errors.Add(ModelState[key].Errors.FirstOrDefault().ErrorMessage); 
} 

return Json(new { success = false, errors = errors }); 
+1

有没有在'OrDefault'没有意义;反正它会失败。 – SLaks 2011-04-12 16:52:58

+0

如果您遇到“LINQifying”这个问题,那么您需要了解更多LINQ。我建议你阅读[Edulinq](http://msmvps.com/blogs/jon_skeet/archive/tags/Edulinq/default.aspx)文章。此外,就像SLaks说的那样,FirstOrDefault比First更糟糕,因为'First'失败时会产生一个有意义的异常,但是如果使用FirstOrDefault,则会失败并返回NullReferenceException。 – 2011-04-12 16:54:06

+0

@Martinho:够公平的......但要公平一点,这就是Scott Hanselmann发布这个代码的方式,我只是试图改进它... http://haacked.com/archive/2010/04/15 /sending-json-to-an-asp-net-mvc-action-method-argument.aspx。我们不可能都是专家......我相信我可以围绕你的其他技能组合运行圈子:) – 2011-04-12 17:03:10

回答

3

确切的翻译是:

var errors = ModelState.Keys.Select(k => ModelState[k].Errors.First().ErrorMessage); 
return Json(new { success = false, errors = errors.ToList() }); 

提供的ModelState是Dictionary<TKey,TValue>或类似的,你可以直接使用的值:

var errors = ModelState.Values.Select(v => v.Errors.First().ErrorMessage); 
return Json(new { success = false, errors = errors.ToList() }); 
+0

完美,thx。这是MVC的模型状态对象。我在我的尝试中接近,但不知道如何选择密钥。有道理,thx。 – 2011-04-12 17:02:19

3

的关闭翻译(这是不安全的,因为FirstOrDefault()可能会返回在这种情况下,您的代码会抛出一个空引用异常空)将是:

return Json(new { success = false, 
        errors = ModelState.Values 
         .Select(ms => ms.Errors.FirstOrDefault().ErrorMessage) 
         .ToList() }); 

你可以让它变成一个更加安全使用:

return Json(new { 
    success = false, 
    errors = 
     ModelState.Values 
        .Select(ms => 
          { 
           var error = ms.Errors.FirstOrDefault(); 
           return error == null ? error.ErrorMessage : ""; 
          }) 
        .ToList() }); 
2
return new Json(new 
    { 
     success = false, 
     errors = ModelState.Keys.Select(k => ModelState[key].Errors.First().ErrorMessage).ToList() 
    });