2012-09-26 11 views
6

ModelStateがコントローラで有効でないときに "OnFailure"を呼び出すとします。コントローラModelStateがInValidのときにAjax.BeginForm OnFailureが呼び出される

[httpPost] 
public ViewResult Login(LoginModel model) 
{ 
    if (ModelState.IsValid) 
    { 

    } 
    else 
    { 
    ModelState.AddModelError("login is fail") 
    } 
    return View("Login",model) 
} 

マイLoginViewで

@using (Ajax.BeginForm("Login", new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "Login",InsertionMode = InsertionMode.Replace, OnSuccess = "Success", OnFailure = "onError" })) 
{ 

} 

にModelStateが有効であれば、それは表示のみと方法ONERRORモデル内にあるすべてのエラーを呼び出して失敗した場合ので、私はするonSuccessメソッドを呼び出したいです状態。ここで

+0

成功機能ではどうしますか?リダイレクトしますか?検証が失敗した場合にエラーメッセージを表示したいと思っているものから>ログオンフォームを含む部分的なビューを返し、DOMから対応する部分をリフレッシュしたいとします。成功事例はどうですか?この場合、クライアントに何を返すのですか?ビュー? –

+0

Darinさんに私のリプレイをお願いします。はい、私は成功にリダイレクトしたいのですが、失敗しました。エラーメッセージでOnFailureだけを呼びたいと思っています。現在アプリケーションでそれはonSuccessメソッドを呼び出すModelStateが有効でない場合でも – Shivkumar

答えて

19

は、あなたが何ができるかです:

[HttpPost] 
public ActionResult Login(LoginModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     // everything went fine and we want to redirect in this case => 
     // we pass the url we want to redirect to as a JSON object: 
     return Json(new { redirectTo = Url.Action("SomeController", "SomeAction") }); 
    } 
    else 
    { 
     // there was an error => add an error message 
     ModelState.AddModelError("login is fail") 
    } 

    // return a partial view instead of a full vire 
    return PartialView("Login",model) 
} 

、次に必要なのは成功の関数である。

あなたが、その場合には、あなたがテストすることができている
@using (Ajax.BeginForm("Login", new AjaxOptions { HttpMethod = "POST", OnSuccess = "loginAjaxSuccess" })) 
{ 

} 

function loginAjaxSuccess(result) { 
    if (result.redirectTo) { 
     // the controller action returned a JSON result => it was a successful login 
     // => we redirect the browser to this url 
     window.location.href = result.redirectTo; 
    } else { 
     // the action returned a partial view with the form containing the errors 
     // => we need to update the DOM: 
     $('#Login').html(result); 
    } 
} 

ところで、エラーの場合に控えめなクライアント側の検証を使用している場合は、あなたがフォームを送信しようとすると、次の時間は、クライアント検証が動作しません。そうでない場合は、手動で新しい検証ルールの解析を強制する必要があります形成:

} else { 
    // the action returned a partial view with the form containing the errors 
    // => we need to update the DOM 
    $('#Login').html(result); 

    // Now that the DOM is updated let's refresh the unobtrusive validation rules on the form: 
    $('form').removeData('validator'); 
    $('form').removeData('unobtrusiveValidation'); 
    $.validator.unobtrusive.parse('form'); 
} 
+0

Drres私はViewResultを使用するとJsonを使用できなくなり、ViewResultはPartailViewを返すことができません – Shivkumar

+0

あなたは 'ActionResult'を使用してください。 –

+0

ありがとうダーリンそれは本当に便利です – Shivkumar

6

あなたはにModelStateに問題を検出すると、設定レスポンスオブジェクトのStatusCodeを400などに設定します(System.Net.HttpStatusCodeクラスからコードを取得できます)

これは、onfailureメソッドを起動します。

si

+0

これは私たちのテスト環境では動作しませんが、私の開発マシンで動作します。テストでは、400を返してもonfailureメソッドは起動しません。すべての手がかりは? – Jeff

関連する問題