用于注销的布局中的 RedirectoAction 问题
Problem with RedirectoAction in Layout for logging out
我在这样的共享布局中有一个 ActionLink
@Html.ActionLink("Logout", "Logout", "Home", new { @class = "navbar-btn btn btn-login" })
在Home的控制器中
public ActionResult Logout()
{
Session.Abandon();
Response.Cookies.Clear();
return RedirectToAction("Login","Home");
}
然后当我按下 Logout
按钮时,如果网页在 /Home
内,它 return 到 /Home/Login
正确,所有会话都被清除。但是当我尝试在 /Home
之外按注销时出现问题,例如在 /CourseUser
中,URL return 然后是 /CourseUser/Logout?Length=4
并且它不存在
我想要的是 return URL '/Home/Logout' 在任何情况下当我按下 'Logout'
感谢https://www.c-sharpcorner.com/UploadFile/abhikumarvatsa/ajax-actionlink-and-html-actionlink-in-mvc/
问题来自
@Html.ActionLink("Logout", "Logout", "Home", new { @class = "navbar-btn btn btn-login" })
本例中的Home
是路由值,不是控制器名称。
解决方案:
@Html.ActionLink("Đăng xuất", "Logout", "Home", null, new { @class = "navbar-btn btn btn-login", @type = "button" })
@Html.ActionLink
将生成一个 link。单击它将导致对服务器的 HttpGet 请求。这对于任何不改变任何状态的东西都很好,因为 HttpGet 操作应该是幂等的——多次调用它具有相同的效果。
对于注销,我认为最佳实践和标准建议使用 HttpPost,您可以使用隐藏形式实现它 post:
<a href="javascript:$('#form-logout').submit();">
Logout
</a>
@using(Html.BeginForm("logout", "account", new { area = "" }, FormMethod.Post,
new { @id = "form-logout", @class = "d-none" }))
{
@Html.AntiforgeryToken();
}
单击 link 将触发隐藏表单的提交,这将 post 返回控制器中定义的注销方法,名称为 AccountController
,例如:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Logout()
{
Session.Abandon();
Response.Cookies.Clear();
return RedirectToAction("index", "dashboard", new { area = "" });
}
只需在第四个参数中添加null,如下所示:
//parameters in order: title, action name , controller name , route values, html attributes
@Html.ActionLink("Logout", "Logout", "Home",null, new { @class = "navbar-btn btn btn-login" })
或者您可以不添加 html 属性,如下所示
//parameters in order: title, action name , controller name
@Html.ActionLink("Logout", "Logout", "Home" })
我在这样的共享布局中有一个 ActionLink
@Html.ActionLink("Logout", "Logout", "Home", new { @class = "navbar-btn btn btn-login" })
在Home的控制器中
public ActionResult Logout()
{
Session.Abandon();
Response.Cookies.Clear();
return RedirectToAction("Login","Home");
}
然后当我按下 Logout
按钮时,如果网页在 /Home
内,它 return 到 /Home/Login
正确,所有会话都被清除。但是当我尝试在 /Home
之外按注销时出现问题,例如在 /CourseUser
中,URL return 然后是 /CourseUser/Logout?Length=4
并且它不存在
我想要的是 return URL '/Home/Logout' 在任何情况下当我按下 'Logout'
感谢https://www.c-sharpcorner.com/UploadFile/abhikumarvatsa/ajax-actionlink-and-html-actionlink-in-mvc/
问题来自
@Html.ActionLink("Logout", "Logout", "Home", new { @class = "navbar-btn btn btn-login" })
本例中的Home
是路由值,不是控制器名称。
解决方案:
@Html.ActionLink("Đăng xuất", "Logout", "Home", null, new { @class = "navbar-btn btn btn-login", @type = "button" })
@Html.ActionLink
将生成一个 link。单击它将导致对服务器的 HttpGet 请求。这对于任何不改变任何状态的东西都很好,因为 HttpGet 操作应该是幂等的——多次调用它具有相同的效果。
对于注销,我认为最佳实践和标准建议使用 HttpPost,您可以使用隐藏形式实现它 post:
<a href="javascript:$('#form-logout').submit();">
Logout
</a>
@using(Html.BeginForm("logout", "account", new { area = "" }, FormMethod.Post,
new { @id = "form-logout", @class = "d-none" }))
{
@Html.AntiforgeryToken();
}
单击 link 将触发隐藏表单的提交,这将 post 返回控制器中定义的注销方法,名称为 AccountController
,例如:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Logout()
{
Session.Abandon();
Response.Cookies.Clear();
return RedirectToAction("index", "dashboard", new { area = "" });
}
只需在第四个参数中添加null,如下所示:
//parameters in order: title, action name , controller name , route values, html attributes
@Html.ActionLink("Logout", "Logout", "Home",null, new { @class = "navbar-btn btn btn-login" })
或者您可以不添加 html 属性,如下所示
//parameters in order: title, action name , controller name
@Html.ActionLink("Logout", "Logout", "Home" })