我有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?
答案 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]
属性所需的反伪造令牌。