我的主页控制器操作无法识别User.Identity.Name

时间:2014-08-06 12:28:07

标签: c# asp.net-mvc asp.net-mvc-4 session forms-authentication

我的网站使用会话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方法(这对于一个匿名用户而言)并且因为它是缓存的,而不是“甜甜圈”缓存的一部分,所以每个人都得到缓存的响应......

1 个答案:

答案 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