2015-10-09 98 views
0

烧成我有一个jquery函数:MVC Ajax调用不与ValidateAntiForgeryToken

function ExpireSession() { 
      $.ajax({ 
       type: "POST", 
       url: '@Url.Action("LogOffSession","Account")', 
       dataType: "json", 
       success: function (data) { 
       }, 
       error: function (data) { 
       } 
      }); 
     } 

,其从上述函数调用的动作的方法是:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult LogOffSession() 
    { 
     Session.Abandon(); 
     FormsAuthentication.SignOut(); 
     return Json(new { result = true }); 
    } 

jQuery函数被调用(我测试警报),但操作方法未被调用。我尝试了成功和错误功能,但没有效果。

我也给jQuery函数这样

function ExpireSession() { 
      var url = '@Url.Action("LogOffSession", "Account")'; 
      $.post(url, null, function (data) { 
       return true; 
      }); 

但它仍然是行不通的尝试。

这是什么我做错了?

+6

你的方法用'[ValidateAntiForgeryToken]'装饰,但你不传递该标记,所以该方法永远不会运行。 –

+0

@StephenMuecke是正确的。您可以通过在控制台中检查请求的结果来诊断像这样的问题。在这种情况下,您很可能会看到500错误。 –

+0

是的你是对的。从action方法中移除ValidateAntiForgeryToken可以完成这项工作...... – nitinvertigo

回答

0

该方法失败的原因是在操作方法中包含AntiForgeryToken。删除它的伎俩。

要在您的操作方法和jquery调用中包含AntiForgeryToken,请检查this

感谢Stephen Muecke的澄清。

0

你可以尝试做它喜欢默认的MVC模板,包括像这样在你的页面的表单:

@if (Request.IsAuthenticated) 
      { 
       using (Html.BeginForm(MVC.Account.LogOff(), FormMethod.Post, new { id = "logoutForm" })) 
       { 
        @Html.AntiForgeryToken() 

        <a href="javascript:document.getElementById('logoutForm').submit()"> 
         <i class="fa fa-sign-out"></i> Log out 
        </a> 
       } 
      } 

你可以做document.getElementById('logoutForm').submit()从JavaScript注销。不需要在表单中包含注销链接,它可以隐藏。 这会照顾AntiForgeryToken。
但是我会争辩说,您不需要使用AntiForgeryToken保护您的注销方法,您可以删除该属性,只需调用网址即可。