在ValidationSummary中,爲什麼消息以與向ModelState添加錯誤的順序不同的順序顯示,以及我如何解決此問題?通過更改驗證消息的順序來停止Html.ValidationSummary()
回答
asp.net mvc是開源的,所以你可以直接看到ValidationSummary的代碼。
http://www.asp.net/mvc/download/
這麼說,我敢肯定的ModelState是一本字典。因此,如果ValidationSummary遍歷ModelState字典中的鍵/值來查找錯誤,那麼順序將是隨機的。
我下載了工作中的代碼。從在的ValidationSummary MVC/HTML/ValidationExtensions.cs:
foreach (ModelState modelState in htmlHelper.ViewData.ModelState.Values) {
foreach (ModelError modelError in modelState.Errors) {
// stuff to build a string with the error
}
}
所以它遍歷在字典中的值。並從MSDN:
爲了枚舉的目的,字典中的每個項目被視爲KeyValuePair(TKey,TValue)結構表示值和它的鍵。 項目返回的順序未定義。
和
值的字典中的順序(TKEY的,TValue).ValueCollection是未指定
重點礦。
ValidationSummary是如此簡單,正如上面指出的那樣,它只是2個循環(您可以在1中使用LINQ的SelectMany),因此您可以爲此創建自己的局部視圖並在5分鐘內將其放置在主佈局中。
並且考慮到ValidationSummary不會在ModelState中顯示Exceptions,所以無論如何都有很好的理由這樣做。
如果你想有相同的順序在您的視圖控件,你可以這樣寫:jQuery:
var list = {};
<% foreach (var error in ModelState)
{%>
list['<%=error.Key%>'] = '<%=error.Value.Message%>';
<%}%>
$(*[name]).each(function(i,o){
isError = list.indexOf(o.name) >= 0;
if (isError)
$(".validationSummary").append("<li>" + list[o.name] + "</li>");
});
嗯,這個代碼是從我的頭,這是僞...但是這是觀念。基本上你用name屬性遍歷所有元素,並檢查ModelState和錯誤。要做到這一點,您的服務器端代碼會創建一個客戶端錯誤字典。
一個更好的方法是編寫一個HtmlHelper擴展,它基本上是一樣的,但是在C#代碼文件中這樣它就不會混亂你的視圖。
<ul class="validation-summary-errors">
<%
foreach (ModelState modelState in (ViewContext.ViewData.ModelState.Values)){
foreach (ModelError modelError in modelState.Errors) {
// stuff to build a string with the error
%>
<li><%=modelError.ErrorMessage %></li>
<%
}
}
%>
</ul>
這可能是有幫助的..
我有這個問題,並快速解決它,我重新像上面的驗證摘要和使用ViewBag通過引用數組存儲在正確的順序錯誤有序的字段名稱。不是特別好,但是當時我能想到的最快的事情。剃刀/ MVC3。
控制器代碼:
List<string> fieldOrder = new List<string>(new string[] {
"Firstname", "Surname", "Telephone", "Mobile", "EmailAddress", "AddressLine1", "AddressLine2", "TownCity", "County" })
.Select(f => f.ToLower()).ToList();
ViewBag.SortedErrors = ModelState
.Select(m => new { Order = fieldOrder.IndexOf(m.Key.ToLower()), Error = m.Value})
.OrderBy(m => m.Order)
.SelectMany(m => m.Error.Errors.Select(e => e.ErrorMessage))
.ToArray();
然後在視圖:
@if (!ViewData.ModelState.IsValid)
{
<div class="validation-summary-errors">
<ul>
@foreach (string sortedError in ViewBag.SortedErrors)
{
<li>@sortedError</li>
}
</ul>
</div>
}
除了以前的答案,你可以使用FluentValidation框架,而不是數據註釋。如果爲了避免使用ModelState
並手動創建驗證器,則ValidationResult
對象將按照相同的順序包含錯誤,因爲在驗證器構造函數中添加了相應的規則。
此外,如果啓用了客戶端驗證 - 錯誤消息的順序與HtmlHelper
(可能與Data Annotations生成的輸入相同的行爲)生成的相應輸入的順序相同。
欲瞭解更多信息查看here。
- 1. @ Html.ValidationSummary() - 如何設置錯誤消息的順序
- 2. 如何更改JSON消息的順序?
- 3. 如何更改MVC2的驗證消息?
- 4. 更改默認的驗證消息
- 5. CreateUserWizard - 更改驗證消息的位置
- 6. rails驗證:未通過時的消息?
- 7. 無法在MVC視圖中顯示來自@ Html.ValidationSummary()的驗證消息
- 8. 來自程序的Bean驗證消息
- 9. 自定義驗證錯誤消息不會顯示在Html.ValidationSummary中
- 10. 更改Struts驗證器默認消息
- 11. Symfony2更改默認驗證器消息
- 12. 更改驗證錯誤消息
- 13. jquery驗證錯誤消息 - 更改消息的位置
- 14. 如何通過發送驗證消息來驗證用戶的手機號碼?
- 15. MVC3:如何更改通用[必需的]驗證消息文本?
- 16. zend驗證程序過早消息
- 17. Asp.net驗證錯誤消息來更改標籤文本
- 18. 通定製驗證消息
- 19. 更改mootools表單驗證程序的默認錯誤消息
- 20. 更改暫停消息
- 21. 更改文化後驗證錯誤消息不會更改
- 22. 停止jQuery驗證取消按鈕
- 23. 如何停止彈出消息確認驗證是否失敗
- 24. 通過更改清單文件來禁用UNC消息 - 錯誤消息
- 25. 通過更改容器的寬度來驗證文本
- 26. 驗證消息
- 27. 驗證消息
- 28. 通過REST API驗證/更改密碼
- 29. 驗證字段,驗證相關模型以及順序或錯誤消息
- 30. 阻止Zend翻譯驗證消息