在 ASP.NET 个 MVC 应用程序之间共享数据
Share Data across ASP.NET MVC application
最近我继承了一个 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 数据不会改变,除非应用程序池被回收)并且应该有更好的方法来做到这一点。我的要求是:
- 调用一次 GetDataFromWebService 方法。
- 在多个视图中共享 feedItems。
我看过 this SO post 但我不确定这是否适合我的情况,因为我希望网络服务只被命中一次。
执行此操作的最佳方法是什么?
谢谢!
如果您想在每个会话中获取一次,请将变量存储在会话范围内。
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>
}
最近我继承了一个 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 数据不会改变,除非应用程序池被回收)并且应该有更好的方法来做到这一点。我的要求是:
- 调用一次 GetDataFromWebService 方法。
- 在多个视图中共享 feedItems。
我看过 this SO post 但我不确定这是否适合我的情况,因为我希望网络服务只被命中一次。
执行此操作的最佳方法是什么?
谢谢!
如果您想在每个会话中获取一次,请将变量存储在会话范围内。
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>
}