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