2011-09-21 73 views
1

我正在爲我的頁面使用Ajax.BeginForm。客戶端驗證會執行其工作並在驗證摘要區域中顯示任何錯誤。現在,當控制器發生服務器端錯誤時,我需要相同的行爲。如何使用ajax.beginform處理MVC3中的服務器端錯誤

在標準形式中,您將AddModelError添加到ModelState並返回到表單,並更新字段和驗證摘要。但對於Ajax,我無法實現這個工作。

我的控制器返回一個JsonResult(這可能不是正確的方法,但我可以輕鬆地將我的更新信息返回到表單),而我所做的第一件事是檢查ModelState.IsValid。如果這是錯誤的,那麼如何在驗證摘要中的頁面上顯示這些錯誤?

我返回一個字典集合與字段名稱和錯誤,並調用這個程序,這是非常簡單,只是從jQuery的考慮:

function ShowFormErrors(validator, errors) 
{ 
if(errors) { 
    // add items to error list and map 
    $.extend(validator.errorMap, errors); 
    validator.errorList = []; 
    var curElement; 
    for (var name in errors) { 
     for(var elm=0; elm<validator.currentElements.length; elm++) 
     { 
      if(validator.currentElements[elm].name == name) 
      { 
       curElement = validator.currentElements[elm]; 
       break; 
      } 
     } 

     validator.errorList.push({ 
      message: errors[name], 
      element: curElement   //this.findByName(name)[0] 
     }); 
    } 
    // remove items from success list 
    validator.successList = $.grep(validator.successList, function(element) { 
     return !(element.name in errors); 
    }); 
} 
validator.settings.showErrors 
    ? validator.settings.showErrors.call(validator, validator.errorMap, validator.errorList) 
    : validator.defaultShowErrors(); 

}

此代碼的工作,但永遠不會調用驗證。 settings.showErrors,因爲我不認爲showErrors在validate.unobtrusive.js中,但是在validate.js中。

我結束了設置和本地結算驗證摘要:

function ShowValiationSummaryErrors(validator) 
{ 
    var frm = validator.currentForm; 
    var container = $(frm).find("[data-valmsg-summary=true]"), list = container.find("ul"); 

    if (list && validator.errorList.length) { 
     list.empty(); 
     container.addClass("validation-summary-errors").removeClass("validation-summary-valid"); 

     $.each(validator.errorList, function() { 
     $(list).append($("<li />").html(this.message)); 
     }); 
    } 
} 


function ClearValidationSummary() 
{ 
var container = $('form').find('[data-valmsg-summary="true"]'); 
var list = container.find('ul'); 

    if (list && list.length) 
    { 
    list.empty(); 
     container.addClass('validation-summary-valid').removeClass('validation-summary-errors'); 
    } 
} 

回答

0

什麼是簡單的是讓你的控制器動作通過注入新的內容返回一個包含一種形式的局部視圖,然後更新DOM。這種方式會自動顯示錯誤。如果您返回JSON,則必須將這些信息包含在JSON字符串中,然後手動更新相關部分以顯示錯誤。

+0

好的,那是怎麼完成的?我正在返回一個Dictionary集合,其名稱和消息顯示在客戶端。然後我更新validators.errorlist和成功列表集合並調用defaultShowErrors()。這會使字段顯示並顯示字段錯誤消息,但不會將錯誤置於驗證摘要中。我將使用此代碼更新原始帖子。 –

相關問題