Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建自定义BaseController以在用户登录时保留有关用户的数据_C#_Asp.net Mvc_Asp.net Mvc 4_Simplemembership - Fatal编程技术网

C# 如何创建自定义BaseController以在用户登录时保留有关用户的数据

C# 如何创建自定义BaseController以在用户登录时保留有关用户的数据,c#,asp.net-mvc,asp.net-mvc-4,simplemembership,C#,Asp.net Mvc,Asp.net Mvc 4,Simplemembership,我在我的应用程序中使用SimpleMembership,当我需要获取当前用户的userId时,我使用WebSecurity.CurrentUserId,但这会调用数据库,我需要减少对数据库的调用 这就是为什么我想在这里创建BaseController:Controller来存储userId。实现这一点的最佳方式是什么 我可以创建: public class BaseController : Controller { public int CurrentUserId { get; set

我在我的应用程序中使用
SimpleMembership
,当我需要获取当前用户的
userId
时,我使用
WebSecurity.CurrentUserId
,但这会调用数据库,我需要减少对数据库的调用

这就是为什么我想在这里创建
BaseController:Controller
来存储
userId
。实现这一点的最佳方式是什么

我可以创建:

public class BaseController : Controller
{
     public int CurrentUserId { get; set; }
     ...

登录后设置此值。但我确信这不应该如此简单。

将HttpContext上的用户属性设置为登录用户。像这样(从我的CustomPrincipal实现中提取)

在您的Global.asax中:

protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
{
    /// Code to get user
    ...
    ContextHelper.GetHttpContextBase().User = user;
}
在另一个助手类中:

public static class ContextHelper
{
    public static HttpContextBase GetHttpContextBase()
    {
        return new HttpContextWrapper(HttpContext.Current);
    }
}
然后在BaseController中:

public abstract class BaseController : Controller
{
    public new HttpContextBase HttpContext { get; private set; }

    protected virtual new ICustomPrincipal User
    {
        get { return HttpContext.User as ICustomPrincipal; }
    }
}

我将使用声明来存储用户ID。这将在cookie中保留信息,并消除每次需要访问数据库时访问数据库的需要。这是一个例子。本文特别将用户ID放在声明中

ICustomPrincipal
是什么<代码>ContextHelper.GetHttpContextBase().user=user用户可以是我的类,对吗?如上所述,ICustomPrincipal是我的实现。如果您的用户属于不同的类型,您显然需要更改该类型。关键是,您应该将当前登录的用户设置为HttpContext的user属性。