@ Url.action()的ASP.NET MVC帖子

时间:2014-01-28 13:12:45

标签: asp.net asp.net-mvc html-helper

我有asp.net自动生成的以下控制器

    //
    // POST: /Account/LogOff
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        AuthenticationManager.SignOut();
        return RedirectToAction("Index", "Home");
    }

现在我有一个注销按钮。目前它看起来像这样:

   <div class="userdrop">
                <ul>
                    <li><a href="@Url.Action("Manage", "Account")">Profile</a></li>                       
                    <li><a href="@Url.Action("LogOff", "Account")">Logout</a></li>
                </ul>
            </div><!--userdrop-->

但它不起作用,我猜它是因为它是一个Post动作方法。

我该如何“退出”?

[编辑]

为什么它会自动生成为Http Post?这样更安全吗?它在注销时是否不随身携带cookie?

3 个答案:

答案 0 :(得分:9)

  

我该如何“退出”?

使用表单而不是锚点:

<li>
    @using (Html.BeginForm("LogOff", "Account"))
    {
        @Html.AntiForgeryToken()
        <button type="submit">Logout</button>
    }
</li>

如果需要,您可以调用CSS向导来设置此按钮的样式。但在这种情况下,语义上正确的元素是一个html表单,允许您发送POST动词。

答案 1 :(得分:7)

没有令人信服的理由认为这是HttpPost。我知道它是以这种方式生成的,但实际上你并没有POST任何数据。只需删除该属性,它就可以正常工作。

现在,如果您希望它与HttpPost一起使用,那么您需要将其包含在Form中并将其设为submit按钮 submit表单onclick

<li>
    @using (Html.BeginForm("LogOff", "Account",
        FormMethod.Post, new { id = "LogOffForm" }))
    {
        @Html.AntiForgeryToken()
        <a href="@Url.Action("LogOff", "Account")"
            onclick="$('#LogOffForm').submit();">Logout</a>
    }
</li>

答案 2 :(得分:3)

你是对的,它与[HttpPost]属性有关,它只允许发出HTTP POST请求。常规HTML锚点会触发HTTP GET请求,因此您的示例不起作用。

一种解决方案是这样的:

@using (Html.BeginForm("LogOff", "Account", FormMethod.Post, 
          new { id = "logoutForm" })) {
    @Html.AntiForgeryToken()
    <button type="submit">Log off</button>
}

我相信这与MVC4中默认模板的作用相近。

请注意我们如何传递[ValidateAntiForgeryToken]属性所需的反伪造令牌。