MVC3剃刀引擎执行/渲染顺序(MVC3 Razor Engine execution/render

2019-10-16 13:35发布

我有几个链接(登录,注销和注册)在_layout模板,这里的链接取决于用户是否登录显示像这样:

if (User.Identity.IsAuthenticated)
{
    <span class="username">@User.Identity.Name</span>
    <span class="link">@Html.ActionLink("Logout", "Logout", "Account")</span>
}
else
{
    <span class="link">@Html.ActionLink("Login", "Login", "Account")</span>
    <span class="link">@Html.ActionLink("Register", "Register", "Account")</span>
}

问题是,注销链接仍显示在第一时间的用户退出系统(我期望与登录立即更换,并注册链接) - 这是直到页面刷新,或者用户移动到另一页。 这里是注销操作的代码:

public ActionResult Logout()
{
    FormsAuthentication.SignOut();
    Session.Abandon();

    return View();
}

-我已经通过这个环节去http://mvcdev.com/differences-between-asp-net-razor-and-web-forms-view-engines/ -这也解释了剃刀引擎的执行顺序,但对我来说它似乎是执行不同。 理想的情况是我期望FormsAuthentication.SignOut()在_layout的User.Identity.IsAuthenticated之前执行。

我究竟做错了什么? 谢谢!

Answer 1:

这是正常的,你需要注销后重定向:

public ActionResult Logout()
{
    FormsAuthentication.SignOut();
    Session.Abandon();

    return RedirectToAction("Index");
}

之所以出现这种情况是因为当客户端请求他还在验证注销链接(他发来的验证cookie与请求一起)。 然后控制器的动作里面你正在登录他出去( FormsAuthentication.SignOut()它什么都不做超过标志着在后续请求移除身份验证cookie。 然后返回一个观点,这种观点当然用户仍然认证为这一观点相同的请求下执行和饼干仍然存在里面。



文章来源: MVC3 Razor Engine execution/rendering order