3

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

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

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

我真的不想在我的每个方法中重复这段代码,我正在寻找一种在我的视图中访问会话的通用方法,有什么想法吗?

4

2 回答 2

4

如果您有机会更改视图的基类,您可以从基础 ServiceStack MVC Controller复制代码,例如:

protected object userSession;
protected TUserSession SessionAs<TUserSession>()
{
    return (TUserSession)(userSession ?? (userSession = Cache.SessionAs<TUserSession>()));
}

ServiceStack.ServiceInterface 命名空间ICacheClient.SessionAs<T>中的扩展方法在哪里。但是,如果您没有机会使用自定义基类,则对类型化会话的完全限定访问是:

EndpointHost.AppHost.TryResolve<ICacheClient>().SessionAs<TUserSession>();

还要确保您安装了最新版本的 ServiceStack。

于 2012-09-25T10:01:52.237 回答
2

使用servicestack v4并根据我对这个答案的理解

我有以下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...
}
于 2014-12-28T03:45:21.897 回答