MVC3 Razor引擎执行/渲染顺序

时间:2011-05-23 06:28:06

标签: asp.net-mvc-3 razor

我在_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/ - 它解释了Razor引擎的执行顺序,但在我的情况下它似乎执行不同。理想情况下,我希望FormsAuthentication.SignOut()在_layout中的User.Identity.IsAuthenticated之前执行。

我做错了什么?谢谢!

1 个答案:

答案 0 :(得分:3)

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

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

    return RedirectToAction("Index");
}

发生这种情况的原因是,当客户端请求Logout链接时,他仍然经过身份验证(他发送了身份验证cookie以及请求)。然后在控制器操作中,您将其注销(FormsAuthentication.SignOut()),这只会在后续请求上标记要删除的身份验证Cookie。然后你返回一个视图,当然在这个视图中,用户仍然被认证,因为这个视图在同一个请求下执行,并且cookie仍然存在。