我的网站使用会话Cookie和表单身份验证。当用户进入时,菜单会检查用户是否通过以下方式登录:
Request.IsAuthenticated
这很有效。
然后我在部分视图中为用户个人资料构建该菜单项,如下所示:
@model MyApp.Models.LoginStatusModel
@if (Model.IsAuthenticated)
{
<a href="#" class="dropdown-toggle menuItem" data-toggle="dropdown" style="color: red;">@User.Identity.Name <b class="caret"></b></a>
}
else
{
<a href="#" class="dropdown-toggle menuItem" data-toggle="dropdown">Profile <b class="caret"></b></a>
}
<ul class="dropdown-menu">
@if (!Model.IsAuthenticated)
{
<li><a href="/Account/Register">Register</a></li>
<li><a href="/Account/Login">Login</a></li>
<li><a href="/Account/ForgotPassword">Forgot Password</a></li>
}
else
{
<li><a href="/Trak/List">Trak</a></li>
<li><a href="/Account/ChangePassword">Change Password</a></li>
<li><a href="/Account/EditProfile">Edit Profile</a></li>
<li><a href="/Account/Logout">Logout</a></li>
}
</ul>
这很有效。
在我的主页控制器动作中(HomeController Index方法我有这个:
public ActionResult Index()
{
try
{
var topGuys = FillTopGuys();
var upcomingMatches = GetUpcomingMatches();
var pickemLeaders = GetPickemLeaders();
var wtGuys = GetTrakGuys();
var wtSchools = GetTrakSchools();
return View(new HomeModel
{
TopGuys = topGuys,
UpcomingEvents = upcomingMatches,
Leaders = pickemLeaders,
Schools = wtSchools,
Guys = wtGuys
});
}
catch (Exception ex)
{
_errorService.LogError(new Exception("Exception occurred trying to load the home page. " + ex.Message, ex));
return View("Error");
}
}
但是,在下面的GetTrakGuys方法中,User.Identity.Name将返回为空(或null)。我现在无法告诉确切的价值,除了我让代码给我发电子邮件的价值,它是空白的。 (我正在工作,因此无法通过Visual Studio进行调试,但仍尝试修复它)
private List<WtWrestlerModel> GetTrakGuys()
{
var body = "";
try
{
body = "Username: " + User.Identity.Name + Environment.NewLine;
if (string.IsNullOrEmpty(User.Identity.Name))
return null;
.................
}
catch {}
}
为什么User.Identity.Name在这里是空白的,即使局部视图能够使用该值,而其他控制器也使用相同的User.Identity.Name?
编辑:
我不确定这是否重要(通常在这种情况下,对吗?),但我在整个HomeController上使用DevTrends.DonutCaching ......
EDIT2:
以下是如何在HomeController上配置DonutCaching:
#if !DEBUG
[DonutOutputCache(Duration = 3600)]
#endif
public class HomeController : Controller
昨晚我部署了这个更新(在开发框上工作,显然......但没有缓存)。即使从昨晚开始经过一个小时,它仍然无效。
哦,也许它正在缓存整个Index方法(这对于一个匿名用户而言)并且因为它是缓存的,而不是“甜甜圈”缓存的一部分,所以每个人都得到缓存的响应......
答案 0 :(得分:1)
要使甜甜圈缓存起作用,您需要定义“甜甜圈洞”,它们是不会被缓存的单独MVC操作。以下是文档中的示例:
如果您在此阶段运行应用程序,DonutOutputCache将会 只需采用与内置OutputCache相同的方式并缓存 完整页面。为了启动甜甜圈缓存,我们需要介绍一个 甜甜圈洞。请记住,我们通过添加几个来实现这一点 Action HTML帮助程序的重载。在所有重载中,我们只需要 在调用中添加一个最终的true参数,表示我们不想要 它与父页面一起缓存。
@Html.Action("Login", "Account", true)
再次运行该应用程序 你会看到甜甜圈缓存在行动。虽然父页面会 缓存你指定的任何持续时间,甜甜圈洞行动 将在每次请求时执行。
http://www.devtrends.co.uk/blog/donut-output-caching-in-asp.net-mvc-3