2011-05-23 79 views
1

我有几个链接(登录,注销和注册)在_layout模板,这里的链接取决于用户是否登录显示像这样:MVC3剃刀引擎执行/渲染顺序

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之前执行。

我在做什么错?谢谢!

回答

3

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

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

    return RedirectToAction("Index"); 
} 

之所以出现这种情况是因为当客户端请求他还在验证注销链接(他发来的验证cookie随着请求) 。然后在控制器操作中,您将其注销(FormsAuthentication.SignOut()),该操作只不过是在后续的请求上标记要删除的身份验证Cookie。然后你返回一个视图,当然这个视图里面的用户仍然被认证,因为这个视图在相同的请求下执行,并且cookie仍然存在。

+0

谢谢Darin!我不认为这会很简单! – tathagata 2011-05-23 06:47:53