3

現在、servicestack Web アプリを使用して mvc3 を構築しています。私はサービススタック資格情報認証を使用しており、サービススタックセッションを使用しています。

このように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 namespaceICacheClient.SessionAs<T>の Extension メソッドはどこにありますか。ただし、カスタム基本クラスを使用する機会がない場合、型指定されたセッションへの完全修飾アクセスは次のとおりです。

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

また、ServiceStack の最新バージョンがインストールされていることを確認してください。

于 2012-09-25T10:01:52.237 に答える
2

servicestack v4を使用し、この回答からの私の理解に基づいて

ビューでUserSessionを使用できるようにする次のCustomWebViewPageがあります。

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 に答える