6

ModelStateがコントローラーで無効な場合に「OnFailure」を呼び出したい。

私のLoginViewで

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

 } 

コントローラ内

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

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

したがって、ModelStateが有効な場合は、onSuccessメソッドを呼び出し、失敗した場合は、モデル状態にあるすべてのエラーを表示するOnErrorメソッドのみを呼び出します。

4

2 に答える 2

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');
}
于 2012-09-26T10:24:47.827 に答える
6

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

これにより、onfailureメソッドが起動します。

Si

于 2012-09-26T12:14:15.643 に答える