在ASP.NET MVC中存储跨页面的公共日期

时间:2012-04-13 17:29:55

标签: c# asp.net asp.net-mvc

我正在使用基本控制器& OnActionExecuting获取我要显示的“常见”网站数据&保持大多数页面(名称,ID等...不超过4/5字段)

OnActionExecuting中的方法读取数据库&保存到我的视图中提取的ViewBag,但我不能认为这是一种浪费,因为它需要每次OnActionExecuting的DB调用。

如何整合这些数据库调用并减少数据库访问?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我在最近的一个项目中所做的是在登录期间我得到'常见'数据,在这种情况下是UserID,FirstName和ImageName,我将它保存在Auth Ticket中,如下所示:

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字节。

答案 2 :(得分:0)

从基本控制器继承并不意味着您在请求之间具有共享状态。每个请求都将生成一个新的控制器实例。

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

然后是免责声明......这些到数据库的旅行是否昂贵?您是否要针对内存管理问题交换最小延迟问题?

更新:

如果只有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;

内存管理免责声明旨在让您避免查询数据库,获取相同的大型结果集,并在每个用户的会话中推送它。在你记忆中的任何东西之前,只要确保你只保留你需要的东西以及你需要多长时间。

答案 3 :(得分:0)

您可以将System.Runtime.Caching.MemoryCache用于此目的。

一些例子:

缓存将在请求之间保持不变,直到达到每个缓存项目的到期时间。