我使用MVC3在C#创建一个网站。 该网站是使用Web服务客户端。 Web服务每个用户使用一个唯一的会话ID,这是考虑在每个服务调用的最后一个参数。 当你登录你的会话ID。
我能够获取会话ID,并将其保存在我的用户控制的属性:
private string Sid
{
get
{
var sid = Session["Sid"];
return sid == null ? "" : sid.ToString();
}
set
{
Session["Sid"] = value;
}
}
在我的其他控制器我能够得到一个类似性质的会话ID(只是没有二传手),但是当它要求用户控制器做一些地方访问自己的属性来获取ID的会话是空的。
这似乎是会议没有得到控制器之间传输,但我不知道该怎么做。 我想从一个中心位置访问,而不是在每个控制器有特性的会议,但我无法弄清楚如何做到这一点。
搜索后三天谷歌一直没有能够给我答案。 你有什么想法?
为什么不创建它创建的会话变量基本控制器OnActionExecuting
方法,然后让你的所有其他控制器从这个基本控制器继承,就像这样:
public class BaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
Session["Sid"] = Session.SessionID;
base.OnActionExecuting(filterContext);
}
}
public class HomeController : BaseController
{
public ActionResult Index()
{
ViewBag.Name = Session["Sid"];
return View();
}
}
public class TestController : BaseController
{
public ActionResult Index()
{
ViewBag.Name = Session["Sid"];
return View();
}
}
希望这可以帮助!
编辑
按您的评论如下这里,我相信什么,你正在寻找(?):
public class BaseController : Controller
{
public string Sid
{
get
{
var sid = Session["Sid"];
return sid == null ? "" : sid.ToString();
}
set
{
Session["Sid"] = value;
}
}
}
public class HomeController : BaseController
{
public ActionResult Index()
{
Sid = "2343432233aaaa";
ViewBag.Name = Session["Sid"];
return View();
}
}
public class TestController : BaseController
{
public ActionResult Index()
{
ViewBag.Name = Session["Sid"];
return View();
}
}
您可以替换在那里我设置Sid
与会话ID从服务中产生
你所描述的行为是很意外; 会话肯定是一样的,所以还有别的东西造成这种行为。
然而,“正常”的方式来解决这个问题是创建一个自定义SessionWrapper。 该SessionWrapper是具有公共属性静态类,也是最重要的,它是单点在那里你会访问会话 - 因此,所有的控制器都使用这个类用于写入/从会话读取。
一个非常简单的版本将是这个样子:
public static class SessionWrapper
{
public string Sid
{
get
{
var sid = Session["Sid"];
return sid == null ? "" : sid.ToString();
}
set
{
Session["Sid"] = value;
}
}
}