2009-09-23 59 views

回答

1

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是未指定

重點礦。

1

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#代碼文件中這樣它就不會混亂你的視圖。

2
<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> 

這可能是有幫助的..

2

我有這個問題,並快速解決它,我重新像上面的驗證摘要和使用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> 
} 
0

除了以前的答案,你可以使用FluentValidation框架,而不是數據註釋。如果爲了避免使用ModelState並手動創建驗證器,則ValidationResult對象將按照相同的順序包含錯誤,因爲在驗證器構造函數中添加了相應的規則。

此外,如果啓用了客戶端驗證 - 錯誤消息的順序與HtmlHelper(可能與Data Annotations生成的輸入相同的行爲)生成的相應輸入的順序相同。

欲瞭解更多信息查看here