Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.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# 在ASP.NET MVC中存储常用的日期帐户页_C#_Asp.net_Asp.net Mvc - Fatal编程技术网

C# 在ASP.NET MVC中存储常用的日期帐户页

C# 在ASP.NET MVC中存储常用的日期帐户页,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我使用一个基本控制器&OnActionExecuting来获取我想要显示的“公共”站点数据,并在大多数页面上保持访问权限(名称、ID等…不超过4/5个字段) OnActionExecuting中的方法读取数据库并保存到ViewBag,我会在视图中对其进行备份,但我忍不住认为这是一种浪费,因为每次OnActionExecuting都需要一个DB调用 如何合并这些DB调用并减少DB访问?将公共数据值缓存在存储库层中。从基本控制器继承并不意味着您拥有跨请求的共享状态。每个请求将产生一个新的控制器实例

我使用一个基本控制器&OnActionExecuting来获取我想要显示的“公共”站点数据,并在大多数页面上保持访问权限(名称、ID等…不超过4/5个字段)

OnActionExecuting中的方法读取数据库并保存到ViewBag,我会在视图中对其进行备份,但我忍不住认为这是一种浪费,因为每次OnActionExecuting都需要一个DB调用


如何合并这些DB调用并减少DB访问?

将公共数据值缓存在存储库层中。

从基本控制器继承并不意味着您拥有跨请求的共享状态。每个请求将产生一个新的控制器实例

如果不想每次都检索该数据,则需要将其存储在某种状态(缓存、会话、应用程序)。然后,您可以从基本控制器访问存储它的任何机制

然后是免责声明…访问数据库是否昂贵?您是否打算用最小延迟问题换取内存管理问题

更新:

如果只有4-5个字段(看起来是特定于用户的,并且在用户会话期间不会更改),那么我只会将它们存储在会话状态中

这里有个人偏好,但我喜欢在基本控制器/页面中有强类型访问器,用于以下内容:

    protected string Name
    {
        get
        {
            if (Session["Name"] == null)
            {
                var results = GoLoadFields();                    
                return Session["Name"].ToString();
            }

            return Session["Name"].ToString();
        }

        set
        {
            Session["Name"] = value;
        }
    }
然后,在从基本控制器继承的所有控制器中,可以仅引用以下属性:

myAwesomeViewModel.Name = this.Name;

内存管理免责声明旨在让您避免查询数据库,获得相同的大型结果集,并在会话中为每个用户推送它。在内存中保留任何内容之前,请确保只保留所需内容以及所需时间。

我在最近的项目中所做的是在登录过程中,我获得了“通用”数据,在本例中是UserID、FirstName和ImageName,我将其保存在身份验证单中,如下所示:

UserData = pModel.PartyId.ToString() + "|" + pModel.BusinessName + "|" + pModel.FirstName + "|" + pModel.LastName + "|" + pModel.ImageUrl + "|" + UsersRole + "|" + IsAct;//PID, BusName, FirstName, LastName, imgUrl, Role, IsAct

// Create the cookie that contains the forms authentication ticket
HttpCookie authCookie = FormsAuthentication.GetAuthCookie(UN, true);
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value);
FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, UserData);
authCookie.Value = FormsAuthentication.Encrypt(newTicket);
System.Web.HttpContext.Current.Response.Cookies.Add(authCookie);
然后,我在需要数据时检索此Cookie,并按如下方式从中取出数据:

var cookie = context.Request.Cookies[FormsAuthentication.FormsCookieName];
dynamic UN = FormsAuthentication.Decrypt(cookie.Value);
string UserData = UN.UserData;//PID, BusName, FirstName, LastName, imgUrl, Role, IsAct
string[] pFields = UserData.Split('|');
string[] MyRoles = { pFields[5] };
请注意:这只适用于您知道在登录会话期间不会更改的静态数据&请注意您在此Cookie中发布的内容

不要膨胀cookie,或者将字段保持在最小值,最大值是4K,但我的目标是500-1000字节

您可以为此目的使用

一些例子:


缓存将在请求之间持续存在,直到每个缓存项都过期为止。

OnActionExecuting
是老式的ASP.NET吗?好吧,除了在自定义操作筛选器中编写某种自定义提供程序之外,您会在ASP.NET MVC应用程序中使用它吗?“
OnActionExecuting
[is]你能解释一下你的意思吗?我认为,
OnActionExecuting
是MVC框架中控制器的一个新特性。是的,没错。我删除了“old school”这个词,但是OP不需要在这里执行操作。你指的是什么内存管理问题?你的回答暗示我最好使用DB,对吗?ThanksI已经基于SO帮助实现了OnActionExecuted,所以我现在不想将其更改为缓存。我在AuthTicket中保存了一些数字,如上所述,非常有效,谢谢。