背景:
- 我有ASP.NET核心应用程序。我正在尝试将服务器端验证错误写入日志。
- 如果ASP.NET核心模型验证在Web窗体的任何字段中检测到任何错误,则
ModelState.IsValid
为false。 - web表单中的每个字段都列在ModelState.Values中
- 如果“值”有一个或多个错误,则值.错误.计数〉0
- 我想记录a)网页表单字段名称(值的“键”)和b)该字段的每个错误消息。
- 我希望将所有这些信息包含在一行中(即一个C#“字符串”)。
当前代码:
// LOG:
// 2022-10-24 09:37:29.0909|Error|ServiceMenu.Q255: The value '' is invalid.
// 2022-10-24 09:37:35.4096|Error|ServiceMenu.Q265: The value '' is invalid.
if (!ModelState.IsValid)
{
foreach (var k in ModelState.Keys)
{
var v = ModelState[k];
if (v.Errors.Count > 0)
{
string s = k + ": ";
for (int i=0; i < v.Errors.Count - 1; i++)
s += v.Errors[i].ErrorMessage + ", ";
s += v.Errors[v.Errors.Count - 1].ErrorMessage;
_logger.LogError(s);
}
}
return Page();
}
输出示例(两个必填字段Q255和265为空):
2022-10-24 09:37:29.0909|Error|ServiceMenu.Q255: The value '' is invalid.
2022-10-24 09:37:35.4096|Error|ServiceMenu.Q265: The value '' is invalid.
问:我可以用LINQ简化这个嵌套循环吗?
更新日期:
- 谢谢大家
- Evk和T.S.都是绝对正确的:* “不要认为使用LINQ总是好的。"* 我不这么认为-他们的观点很好地被接受了:)
- 奥利弗Weichhold给了我我要找的语法:)
- 下面是我最终得到的代码:
// EXAMPLE LOG:
// 2022-10-24 13:24:10.5242|Error|ServiceMenu.Q255: The value '' is invalid.
// 2022-10-24 13:24:24.9692|Error|ServiceMenu.Q265: The value '' is invalid.
if (!ModelState.IsValid)
{
foreach (var k in ModelState.Keys)
{
var v = ModelState[k];
if (v.Errors.Count > 0)
{
string s = string.Join(", ", ModelState[k].Errors
.Select(x => x.ErrorMessage));
_logger.LogError(k + ": " + s);
}
}
...
1条答案
按热度按时间zpqajqem1#