首页 新闻 会员 周边

MVC3 Session 的问题

0
悬赏园豆:100 [已关闭问题] 关闭于 2012-04-28 12:52

有如下一个异步的 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, 仍然是同样的问题.

xling的主页 xling | 初学一级 | 园豆:6
提问于:2012-04-27 15:45
< >
分享
所有回答(5)
0

是不是jquery.get取不到服务器端对象

zerty | 园豆:202 (菜鸟二级) | 2012-04-27 16:09
0

没细看你的程序,从你的描述来看,应该不会是你的代码问题。

给你个建议:把异步控制器修改为同步控制器,然后读取数据的时候只是简单返回一些模拟数据,这样看是否有问题。如果这个时候有问题,那就是哪个流程里出现了错误。(我想这样是不应该有问题的)

确定了是因为异步控制器导致的,那么你可以分析下这个异步控制器的实现原理,然后在你的代码里进行一些特殊的控制。因为没有使用过异步控制器,个人猜测应该是异步控制器输出的HTML代码跟同步控制器输出的有差异。

无之无 | 园豆:5095 (大侠五级) | 2012-04-27 16:13
0

用fiddler抓下直接浏览器get和jquery.get的请求信息,然后比较,找不出问题再贴出来。

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-04-27 16:13
0

看 flights 這裡 有沒有數值呢。單步 執行一下哦。

無限遐想 | 园豆:3740 (老鸟四级) | 2012-04-27 16:22
0

不好意思, 我犯了个错误,我在 Booking/Reserve 的构造里, 重新对这个 ProductInfo 写入了!晕了一天!

xling | 园豆:6 (初学一级) | 2012-04-28 10:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册