背景:
- 我有 ASP.NET Core 應用程式。我正在嘗試將服務器端驗證錯誤寫入日志。
- 如果 ASP.NET Core 模型驗證在 web 表單的任何欄位中檢測到任何錯誤,
ModelState.IsValid則為 false。 - 網路表單中的每個欄位都列在ModelState.Values 中
- 如果“值”有一個或多個錯誤,則 Value.Errors.Count > 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 和 TS 都是絕對正確的:“不要認為使用 LINQ 總是好的。” 我不知道——他們的觀點很好:)
Oliver 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); } } ...
uj5u.com熱心網友回復:
if (!ModelState.IsValid)
{
var logMessage = string.Join("\n", ModelState.Keys
.Where(x => ModelState[x].Errors?.Count > 0)
.Select(x => $"{x}: " string.Join(", ", ModelState[x].Errors.Select(y => y.ErrorMessage))));
_logger.LogError(logMessage);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/522810.html
