有如下一个异步的 Action
[SessionState(SessionStateBehavior.Required)] public class FlightController : AsyncController { [DisableBrowserCache] public void ListAsync() { //取Session 能取出来 ProductInfo pinfo = SessionHelper.Get<SessionKeys , ProductInfo>(SessionKeys.ProductInfo); AsyncManager.OutstandingOperations.Increment(); Task.Factory.StartNew(() => { var flights = Enumerable.Empty<PKGRoutingOnlineViewModel>(); if(pinfo != null) ///////////// flights = pinfo.AvaliableFlights.Value; ///////////// AsyncManager.Parameters["flights"] = flights; AsyncManager.Parameters["pInfo"] = pinfo; AsyncManager.OutstandingOperations.Decrement(); }); } public ActionResult ListCompleted(IEnumerable<PKGRoutingOnlineViewModel> flights, ProductInfo pInfo) { //将整个 pInfo 保存到 Session里 SessionHelper.Set<SessionKeys>(SessionKeys.ProductInfo , pInfo); ...
AvaliableFlights 的定义:
/////整个问题就是围绕着这个变量. private List<PKGRoutingOnlineViewModel> avaliableFlights = null; /// <summary> /// 可用机票 /// </summary> /// <returns></returns> public Lazy<List<PKGRoutingOnlineViewModel>> AvaliableFlights { get { return new Lazy<List<PKGRoutingOnlineViewModel>>(() => { /////////////////// if(this.avaliableFlights == null) { /////////////////// Debug.Print("avaliableFlights is null"); using(var client = new FlightServiceClient()) { var routings = this.FlightResources.Select(r => r.ResourceID).ToList(); this.avaliableFlights = client.QueryFlightByRoutings(routings , DateTime.Now.AddDays(20) , DateTime.Now.AddDays(25) , this.AdultQty , this.ChildQty) ?? new List<PKGRoutingOnlineViewModel>(); } } else { Debug.Print("avaliableFlights is not null"); } return this.avaliableFlights; }); } }
Flight/List 是通过 jquery.get 方法取得,然后附加到页面 Booking/Reserve 上.
o.GetFlight = function(){ $.get(SITEROOT + "/Flight/List", $.proxy(fillFlight)); } var fillFlight = function(result){ $("#flight").html(result); $("#flightTabs").tabs(); }
现在的问题是:
访问 Booking/Reserve, AvaliableFlights 取得后,直接访问: Flight/List , this.avaliableFlights 变量是有值的.
但是刷新 Booking/Reserve, 即用 jquery.get 去取 Flight/List , this.avaliableFlights 却是 null
我想不明白, 直接访问 Flight/List 有值,用 jquery.get 去取却没有值,
我用 HttpWatch 看了一下,每次请求用 jquery.get 去取 Flight/List , AspNet_SessionID 都是相同的.
我把异步换成同步, 仍然是同样的问题.
我也把 jquery.get 换成直接用 iframe, 仍然是同样的问题.
是不是jquery.get取不到服务器端对象
没细看你的程序,从你的描述来看,应该不会是你的代码问题。
给你个建议:把异步控制器修改为同步控制器,然后读取数据的时候只是简单返回一些模拟数据,这样看是否有问题。如果这个时候有问题,那就是哪个流程里出现了错误。(我想这样是不应该有问题的)
确定了是因为异步控制器导致的,那么你可以分析下这个异步控制器的实现原理,然后在你的代码里进行一些特殊的控制。因为没有使用过异步控制器,个人猜测应该是异步控制器输出的HTML代码跟同步控制器输出的有差异。
用fiddler抓下直接浏览器get和jquery.get的请求信息,然后比较,找不出问题再贴出来。
看 flights 這裡 有沒有數值呢。單步 執行一下哦。
不好意思, 我犯了个错误,我在 Booking/Reserve 的构造里, 重新对这个 ProductInfo 写入了!晕了一天!