如何在我的所有视图上获得servicestack会话?

时间:2012-09-21 13:34:42

标签: asp.net-mvc-3 session servicestack

我目前正在构建一个mvc3 w / servicestack Web应用程序。我正在使用servicestack凭证身份验证并使用servicestack会话。

我已经知道我可以通过这种方式在ViewBag中检索和设置会话来访问视图中的会话:

public partial class HomeController : ControllerBase {
    public virtual ActionResult Index() {
        ViewBag.UserSession = base.UserSession;
        return View();
    }   
}

我真的不想在我的每个方法中重复这段代码,而且我正在寻找一种在我的观点,任何想法中访问会话的通用方法?

2 个答案:

答案 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)

根据servicestack v4

的理解,使用this answer

我有以下 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...
}