C# 跨ASP.NET MVC应用程序共享数据
最近,我继承了一个ASP.NET MVC 4应用程序,它使用global.asax跨视图共享数据C# 跨ASP.NET MVC应用程序共享数据,c#,asp.net-mvc,viewbag,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) {
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
}
}
公共类MVCAPApplication:System.Web.HttpApplication
{
公共静态列表项;
公共静态无效注册表全局过滤器(全局过滤器集合过滤器)
{
filters.Add(新HandleErrorAttribute());
}
公共静态无效注册表项(路由收集路由)
{
routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);
routes.MapRoute(
“默认值”,//路由名称
“{controller}/{action}/{id}”,//带参数的URL
新建{controller=“Home”,action=“Index”,id=UrlParameter.Optional}//参数默认值
);
}
受保护的无效应用程序\u Start()
{
RegisterAllAreas();
Database.DefaultConnectionFactory=newsqlconnectionfactory(@“数据源=(localdb)\v11.0;集成安全性=True;MultipleActiveResultSets=True”);
RegisterGlobalFilters(GlobalFilters.Filters);
注册地址(RouteTable.Routes);
GetDataFromWebService();//昂贵的调用
}
}
有许多使用feedItems的视图,如:
@foreach(mvcapapplication.feedItems中的变量项)
{
@项目名称
}
我相信上面的实现是不正确的(因为feedItems数据不会改变,除非应用程序池被回收),应该有更好的方法来做到这一点。我的要求是:
谢谢 如果希望每个会话获取一次变量,请将其存储在会话范围中 Global.asax
protected void Session_Start(Object sender, EventArgs e)
{
HttpContext.Current.Session["WebServiceData"] = GetDataFromWebService();
}
您可以从razor视图使用会话
看法
@foreach(在(IEnumerable)会话[“WebServiceData”]中的变量项)
{
@项目.标题
}
我不明白为什么这是不正确的。您希望调用该方法一次,并且按照您的方式,该方法在应用程序生命周期中调用一次。需要在每个会话中调用该方法一次,而不是在应用程序生命周期中调用该方法一次。因此,您的变量应存储在会话中,而不是静态作用域中。对于这个愚蠢的问题,我深表歉意。我的错。没有通过global.asax方法。@你的问题并不愚蠢。也许它可以被重写,以便更明确地说明您希望它如何工作。您必须了解asp.net中可用的不同作用域(会话、缓存、查询字符串、表单输入、请求…),以及为什么应该避免静态。如果您想要更好的可伸缩性,应该避免会话。
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>
}