跨ASP.NET MVC应用程序共享数据

时间:2015-03-31 15:21:20

标签: c# asp.net-mvc viewbag

最近,我继承了一个ASP.NET MVC 4应用程序,该应用程序使用global.asax跨视图共享数据。

public class MvcApplication : System.Web.HttpApplication
{
    public static List<Models.Feed> feedItems;

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    }

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True");

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        GetDataFromWebService(); //expensive call
    }       
}

有许多观点使用 feedItems ,如:

@foreach (var item in MvcApplication.feedItems)
{
    <li>@item.Title</li>                  
}

我认为上述实现是不正确的(因为除非应用程序池被回收,否则 feedItems 数据不会改变)并且应该有更好的方法。我的要求是:

  1. 调用 GetDataFromWebService 方法一次。
  2. 在多个视图中共享 feedItems
  3. 我查看了this SO post,但我不确定这是否适用于我的方案,因为我希望网络服务只能被点击一次。

    最好的方法是什么?

    谢谢!

1 个答案:

答案 0 :(得分:2)

如果要在每个会话中获取一次,请将变量存储在会话范围内。

Global.asax中

   protected void Session_Start(Object sender, EventArgs e)
   {
      HttpContext.Current.Session["WebServiceData"] = GetDataFromWebService();
   }

您可以使用剃须刀视图中的会话。

查看

@foreach (var item in (IEnumerable<WebServiceItem>)Session["WebServiceData"])
{
    <li>@item.Title</li>
}