2011-09-07 8 views
13

"Ajax.BeginForm"を使用してフォーム要素を含む部分をレンダリングする "投稿フィードバック"フォームがあります。 OnSuccessイベントは、ModelStateが有効でない場合でもトリガーします。これは正常ですか?モデルが有効でエラーがない場合、OnSuccessイベントがトリガされると、無効なモデルが返されるいくつかのポストバックを実行できることを期待していましたか?モデルが有効ではなくても、 "Ajax.BeginForm"はOnSuccessを実行します

+0

私はこれはで動作するように、不必要に複雑であることに同意します。明らかに、モデルが有効かどうかを示す簡単な値が必要です。 –

答えて

17

これは正常ですか?

はい、もちろんです。サーバーがHTTP 200を送信すると、OnSuccessメソッドが呼び出されます。モデルステートの有効性の概念はサーバー側のみです。あなたのコントローラーアクションがいくつかのビュー/ partial/json/...を返す限り、OnSuccessがトリガーします。コントローラのアクション内で例外がスローされた場合、OnSuccessの代わりにOnErrorがトリガされます。

[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 
    } 
} 

だから、あなたのコントローラのアクションを持つことができ、この場合に対処するために、の線に沿って何かをしますフォームを更新してエラーメッセージをユーザーに表示します。この場合、あなたのフォームを部分的に配置することができます。無効なモデル状態が発生した場合は、コントローラのアクションから部分的なビューを返し、成功した場合は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 
} 

このように、混乱する必要はありませんお使いのコントローラ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

この**データ '**オブジェクトはすべてのブラウザで機能しますか?何か制限や互換性の問題はありますか? –

+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."); 
    } 
} 
関連する問題