2013-07-07 31 views
1

我如何通過視圖模型和其他參數使用jQuery AJAX我的操作方法操作?通行證視圖模型+參數使用Ajax調用

什麼我現在做的動作方法不會被調用。我認爲,原因可能是因爲這些參數沒有被正確地在jquery的AJAX調用的數據對象通過:

jQuery的AJAX:

$('#form-login').submit(function (event) { 
       event.preventDefault(); 

       $.ajax({ 
        url: "/Account/LogOn/", 
        data: $('#form-login').serialize(), 
        contentType: 'application/json; charset=utf-8', 
        success: function (data) { 
         if (data.userAuthenticated) { 
          window.location.href = data.url; 
         } else { 
          formBlock.clearMessages(); 
          displayError($('#errorcred').val()); 
         } 
        }, 
        error: function() { 
         formBlock.clearMessages(); 
         displayError($('#errorserver').val()); 
        } 
       }); 
     }); 

Action方法(它接受視圖模型和其他參數) :

[HttpPost] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
     // Validate the email and password 
     if (ModelState.IsValid) 
     { 
      if (MembershipService.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsService.SignIn(model.UserName, model.RememberMe); 
       if (Url.IsLocalUrl(returnUrl)) 
       { 
        if (Request.IsAjaxRequest()) 
        { 
         return Json(new { userAuthenticated = true, url = returnUrl, isRedirect = true }); 
        } 
        else 
        { 
         return Redirect(returnUrl); 
        } 
       } 
       else 
       { 
        if (Request.IsAjaxRequest()) 
        { 
         return Json(new { userAuthenticated = true, url = Url.Action("Index", "Home"), isRedirect = true }); 
        } 
        else 
        { 
         return RedirectToAction("Index", "Home"); 
        } 
       } 
      } 
     } 
     else 
     { 
      if (Request.IsAjaxRequest()) 
      { 
       return Json(new { userAuthenticated = false, url = Url.Action("LogOn", "Account") }); 
      } 
      else 
      { 
       ModelState.AddModelError("", adm.ErrorUserNamePassword); 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

回答

0

取下$就調用以下:

contentType: 'application/json; charset=utf-8', 

您指定application/json編碼,但$('#form-login').serialize()功能發送application/x-www-form-urlencoded內容。

至於發送RETURNURL參數來講,你可以簡單地從形式action讀它,它應該存在(如果你使用的Html.BeginForm()助手):

$.ajax({ 
    url: this.action, 
    ... 
}); 

而且你可能要重新命名在event變量與別的,因爲這東西是在JavaScript中的保留字:

$('#form-login').submit(function (e) { 
    e.preventDefault(); 

    ... 
}); 
+0

但是,如何正確使用$('#form-login')。serialize()來映射參數,因爲我有兩個參數用於action方法? – vobs

+0

'$('#form-login')。serialize()'只會將表單中存在的參數作爲輸入字段。我注意到你有一個'returnUrl'參數。當Forms Authentication模塊重定向到Login頁面時,該參數通常存在於查詢字符串中。如果你使用'@ Html.BeginForm()'輔助器,它將成爲表單'action'屬性的一部分。所以當你使用'url:this.action'而不是像你一樣('url:「/ Account/LogOn /」')對它進行硬編碼時,它會被傳遞給動作。 –

+0

如果您想手動傳遞附加參數,最簡單的方法是在表單中包含隱藏字段,然後在調用$ .ajax方法之前在JavaScript代碼中設置此隱藏字段的值。然後.serialize函數會考慮到它。 –

0

我發現做到這一點的唯一方法是隻包括第二個參數在你的視圖模型,並繼續牛逼o按照您現在所做的方式序列化您的表單。