2012-11-21 63 views
1

我們在我們的網站上有很多表單用jQuery.dialog顯示,我們使用ajax post請求提交它們。MVC jquery ajax表單服務器端驗證

我已經做了一些公正的研究,從我可以告訴的是,如何從服務器端返回驗證錯誤作爲ajax請求的結果沒有任何確定的模式。

差不多,我能找到的唯一模式是發佈形式,然後做驗證服務器端,在這兩種情況下返回封裝結果的JSON對象,如果結果是不正確的HTML表單

即。

{result: true} 
{success: false, html = "<form>....</form>"} 

所以在情況下,結果是假的,你就需要重新佈線連接起來的項目在表格上,你會與具有驗證錯誤的新形式代替舊形式的任何事件。

這似乎是一個好方法,但你最終可能會返回更多的數據到你需要的客戶端,當他們只需要驗證消息時,你也被迫重新連接表單,這是一個有點煩人。

我確實發現了另一個提到的驗證錯誤,並將它們返回到json對象中,並以某種方式告訴客戶端將它們顯示在正確的字段中。

是否有任何框架使得這更容易,或者我應該寫自己的或只是堅持返回整個部分的形式,並在驗證不正確時重新連線它?

回答

2

我不知道任何處理這個特定情況的框架 - 我不知道有一個明確的最佳實踐 - 但它很容易將驗證錯誤序列化並將它們作爲JSON對象返回。你可以嘗試在此ModelStateDictionary擴展方法:

public static IEnumerable<ValidationResult> GetValidationResults(this ModelStateDictionary dictionary) 
{ 
    foreach (var key in dictionary.Keys) 
     foreach (var error in dictionary[key].Errors) 
      if (error != null) 
       yield return new ValidationResult(error.ErrorMessage, new string[] { key }); 
} 

和Controller:

if (!ModelState.IsValid) 
{ 
    return new JsonResult(ModelState.GetValidationResults()); 
} 

但你說得對,你會再通過對象必須循環和錯誤追加到正確的領域。如果你已經ClientValidationEnabled和UnobtrusiveJavaScriptEnabled設置爲true,則循環將是這個樣子:

$.each(errors, function(i, item) { 
    $('span[data-valmsg-for=' + item.MemberNames[0] + ']').html(item.ErrorMessage); 
}) 

如果不是,它不會是難以企及了錯誤信息,以各自的領域爲對象包含字段名稱。這肯定會爲你節省一些數據,但它將驗證責任的一大部分轉移到Javascript中。就像我說的,我不知道有一個明確的最佳做法,但我過去成功地使用了這種方法。

+0

我打算採取這種方法,而不是循環遍歷我發現的每個錯誤,如果您使用jquery驗證,您可以將它們傳遞給validator.showErrors(),如果您使用正確的json格式 –