0

目前我的母版页顶部有这行代码

@{
    MyApp.Domain.Concrete.FullUserProfile fullUser = (MyApp.Domain.Concrete.FullUserProfile)HttpContext.Current.Session[Membership.GetUser().ProviderUserKey.ToString()];
}

这会在缓存中获取用户的个人资料信息,但我的问题是这将始终可用吗?如果用户长时间登录怎么办。如何使他或她的信息不存储在会话中,它将再次从数据库中检索?我很难理解,因为我不知道所有这些代码是否应该在视图中,以及你是否会从后面的代码中调用方法以触发数据库调用并保存到缓存中。我不想把它放在控制器中的原因似乎是重复的。

4

3 回答 3

0

你可以这样做:

@{
    MyApp.Domain.Concrete.FullUserProfile fullUser = null;
    if (Membership.GetUser() != null && Session[Membership.GetUser().ProviderUserKey.ToString()] != null) {
        //Logged in
        fullUser = (MyApp.Domain.Concrete.FullUserProfile)HttpContext.Current.Session[Membership.GetUser().ProviderUserKey.ToString()];
    } else {
        //Not logged in logic
    }
}

或者你可以试试这个,但我不完全确定,因为我不经常使用 MembershipProvider 系统:

if (Page.User.Identity.IsAuthenticated)
{
    //Logged in
}
else
{
    //Not logged in
}

但是,如果您这样做,您可以设置任何页面/目录所需的表单身份验证,您需要将它们登录到您的 web.config 中。

于 2012-10-06T20:26:33.853 回答
0

如果您需要编写将由多个或所有控制器和/或操作使用的代码,您可以创建过滤器并在其中编写您需要的逻辑,最后您只需在控制器或操作级别应用您的过滤器。

欲了解更多信息:

http://msdn.microsoft.com/en-us/library/dd410056(v=vs.90).aspx

例子:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class CustomFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // execution order: 1
        // your actions here
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // execution order: 2
        base.OnActionExecuted(filterContext);
    }

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        // execution order: 3
        base.OnResultExecuting(filterContext);
    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        // execution order: 4
        base.OnResultExecuted(filterContext);
    }
}

注意执行顺序。的成员IActionFilter在动作之前和动作返回一个继承自的对象之后执行ActionResult(但结果还没有被解析,这意味着HTML还没有生成)。此时的成员IResultFilter被执行,在ActionResult对象生成HTML之前和之后

于 2012-10-06T20:34:54.017 回答
0

您通常会有一个 ViewModel,其中包含您需要显示的用户数据。

动作过滤器会填充数据,因为您担心重复

我不会将用户存储在会话状态中。很难保持同步。(会话和授权超时时间不同)

要检查授权,您不需要访问配置文件使用:

HttpContext.Current.User.Identity.IsAuthenticated
于 2012-10-06T20:41:04.070 回答