2011-09-07 51 views
13

我有一個「提交反饋」表單,它使用「Ajax.BeginForm」來呈現包含表單元素的部分。即使ModelState無效,OnSuccess事件也會觸發。這是正常的嗎?我期望能夠做一些回發導致一個無效的模型,然後當模型是有效的,沒有錯誤,然後OnSuccess事件會觸發?即使模型無效,ASP.NET MVC「Ajax.BeginForm」也會執行OnSuccess

+0

我認爲這是不必要的複雜的工作。我們顯然需要一個簡單的值來指示模型是否有效。 –

回答

17

這是正常的嗎?

是的,當然。如果服務器發送HTTP 200,則會調用OnSuccess方法。模型狀態有效性的概念僅限於服務器端。只要你的控制器動作返回一些view/partial/json/... OnSuccess就會觸發。如果在控制器動作中引發異常,則會觸發OnError而不是OnSuccess。

因此,爲了處理這種情況下,你可以有你的控制器動作做線沿線的東西:

[HttpPost] 
public ActionResult Process(MyViewModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     return Json(new { success = false }); 
    } 
    return Json(new { success = true }); 
} 

然後:

function success(result) { 
    if (result.success) { 
     // the model was valid 
    } else { 
     // the model was invalid 
    } 
} 
你可能失效模式的情況下

現在希望通過刷新表單向用戶顯示錯誤消息。在這種情況下,你可以做的是將你的表單放在partial中,如果發生無效的modelstate,你會從你的controller動作中返回一個partialview,並在成功的情況下返回一個json對象。因此,在您成功處理程序,你可以測試:

function success(result) { 
    if (result.success) { 
     // the model was valid 
    } else { 
     // there were errors => show them 
     $('#myform_container').html(result); 
     // if you are using client side validation you might also need 
     // to take a look at the following article 
     // http://weblogs.asp.net/imranbaloch/archive/2011/03/05/unobtrusive-client-side-validation-with-dynamic-contents-in-asp-net-mvc.aspx 
     // and reattach the client validators to the form as you are 
     // refreshing its DOM contents here 
    } 
} 
+4

謝謝你,謝謝。這個答案是完美的。我很驚訝沒有關於處理這種情況(模型錯誤)與不顯眼的AJAX東西的可靠文檔。 –

+1

不適用於我,因爲如果失敗,我必須返回一個視圖,而不是JSON。 – Misi

+0

我想首先你必須檢查結果的類型:if(typeof(result)==「object」&& result.success){ – Misi

25

我處理這個問題有一個相當簡單的JavaScript技術:

首先設置你OnSuccess這樣的:

OnSuccess = "UpdateSuccessful(data)" 

然後你的javascript函數一樣這個:

function UpdateSuccessful(data) { 
    if (data.indexOf("field-validation-error") > -1) return; 

    // Do your valid stuff here 
} 

這樣就沒有必要搞亂了w第i個控制器,或者更重要的是,你的控制器可以返回Partial View與模型誤差沒有做任何事情奇怪,即:

public ActionResult SaveDetails(Project model) 
    { 
     if (ModelState.IsValid) 
     { 
      model.SaveProject(); 
     } 

     return PartialView("ProjectForm", model); 
    } 

而在你AjaxOptions

UpdateTargetId = "FormContents" 

現在只要確保你有一個div或與id="FormContents"什麼地方顯示您的表單。

+1

'OnSuccess =「UpdateSuccessful(data)」':真的很有幫助。謝謝。 –

+0

這個**'data'**對象是否適用於所有瀏覽器?它是否有任何限制或兼容性問題? –

+0

這應該適用於所有啓用了JavaScript的瀏覽器。 –

3

你可以做到以下幾點:

var OnSuccess = function() { 
    if ($(".validation-summary-errors").length == 0) { 
     //Your javascript/jquery code goes here 
    } 
} 
1

稍有不同的路易斯的回答:

function OnSuccess() { 
    if ($("span[class='field-validation-error']").length == 0) { 
     alert("Target Platform saved Successfully."); 
    } 
} 
相關問題