【问题标题】:My homepage controller action does not recognize User.Identity.Name我的主页控制器操作无法识别 User.Identity.Name
【发布时间】:2014-09-29 09:23:06
【问题描述】:

我的网站使用会话 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...

编辑2:

以下是在 HomeController 上配置 DonutCaching 的方式:

#if !DEBUG
    [DonutOutputCache(Duration = 3600)]
#endif
    public class HomeController : Controller

我昨晚部署了这个更新(显然是在 Dev box 上工作的……但那里没有缓存)。即使从昨晚过去了一个小时,它仍然不起作用。

哦,也许它正在缓存整个 Index 方法(本来是为匿名用户准备的),因为它被缓存了,而不是“甜甜圈”缓存的一部分,所以每个人都会得到缓存的响应......

【问题讨论】:

  • 您使用的是哪种身份验证??
  • 表格,它在问题的第一行... :)
  • 甜甜圈缓存的事情可能很重要......这是如何配置的?
  • @RobertLevy 见 Edit2。我将对甜甜圈缓存进行调整,看看是否可以修复...

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


【解决方案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

【讨论】:

  • 是的,这就是我现在正在做的事情。我已经为我在问题中发布的菜单项部分视图实现了这一点。正在为此做同样的事情。现在我遇到了尝试直接从 BitBucket 更新我的代码的问题......遇到了合并错误,我正在努力解决这个问题(我的 LoginStatus 代码正在使用 @Html.Action(... ...))
  • 仅供参考 - 我开始使用用户名收到我的调试电子邮件......所以这绝对是修复。现在,如果我只记得在部署之前将我的视图添加到 csproj ......在工作时试图直接从 bitbucket 进行代码更改并且无法测试......
  • 快速提问罗伯特,因为 @Html.Action 是从缓存的页面/视图中调用的,并且返回的部分视图是针对特定用户的,如果没有,我怎么能缓存它参数被传递(所以每个用户都有一个缓存结果)?如果我尝试从 @Html.Action("action", "controller", true, new { username = User.Identity.Name }) 发送参数,那不会拉缓存值(在我的示例中是匿名的)?
  • 如果你传递 'true',它不会为那个位使用缓存。如果您希望它有时缓存,请使用不同的操作
猜你喜欢
  • 2022-08-17
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 2016-05-30
相关资源
最近更新 更多