我目前正在构建一个mvc3 w / servicestack Web应用程序。我正在使用servicestack凭证身份验证并使用servicestack会话。
我已经知道我可以通过这种方式在ViewBag中检索和设置会话来访问视图中的会话:
public partial class HomeController : ControllerBase {
public virtual ActionResult Index() {
ViewBag.UserSession = base.UserSession;
return View();
}
}
我真的不想在我的每个方法中重复这段代码,而且我正在寻找一种在我的观点,任何想法中访问会话的通用方法?
答案 0 :(得分:4)
如果您有机会更改视图的基类,则只需复制base ServiceStack MVC Controller中的代码,例如:
protected object userSession;
protected TUserSession SessionAs<TUserSession>()
{
return (TUserSession)(userSession ?? (userSession = Cache.SessionAs<TUserSession>()));
}
其中ICacheClient.SessionAs<T>
是ServiceStack.ServiceInterface namespace中的扩展方法。但是,如果您没有机会使用自定义基类,则对键入会话的完全限定访问权限为:
EndpointHost.AppHost.TryResolve<ICacheClient>().SessionAs<TUserSession>();
还要确保安装了最新版本的ServiceStack。
答案 1 :(得分:2)
我有以下 CustomWebViewPage ,它允许我在我的视图中使用 UserSession :
public abstract class CustomWebViewPage : WebViewPage
{
private IServiceStackProvider _serviceStackProvider;
public virtual IServiceStackProvider ServiceStackProvider
{
get
{
return _serviceStackProvider ?? (_serviceStackProvider =
new ServiceStackProvider(new AspNetRequest(base.Context)));
}
}
private object _userSession; // Cache locally
private TUserSession SessionAs<TUserSession>()
{
//ServiceStackProvider.SessionAs<T> always gets the Session from the ICacheClient
return (TUserSession)(_userSession ?? (_userSession = ServiceStackProvider.SessionAs<TUserSession>()));
}
//I have strongly-typed as IAuthSession for now, until I see a need to add my own Custom Session
protected IAuthSession UserSession
{
get { return SessionAs<IAuthSession>(); }
}
public virtual bool IsAuthenticated
{
get { return ServiceStackProvider.IsAuthenticated; }
}
}
public abstract class CustomWebViewPage<TModel> : WebViewPage<TModel>
{
//EXACTLY the same as above...
}