2011-05-04 86 views
3

我使用會話的包裝是這樣的:使用會話包裝更換直接呼叫會話變量

public interface ISessionWrapper 
{ 
    // ... 
    CultureInfo Culture { get; set; } 
} 

public class SessionWrapper: ISessionWrapper 
{ 
    private T GetFromSession<T>(string key) 
    { 
     return (T)HttpContext.Current.Session[key]; 
    } 

    private void SetInSession(string key, object value) 
    { 
     HttpContext.Current.Session[key] = value; 
    } 

    // ... 

    public CultureInfo Culture 
    { 
     get { return GetFromSession<CultureInfo>("Culture"); } 
     set { SetInSession("Culture", value); } 
    } 
} 

我可以用這個接口在我的控制器是這樣的:

private readonly ISessionWrapper sessionWrapper = new SessionWrapper(); 
// ... 
ci = new CultureInfo(langName); 
sessionWrapper.Culture = ci; 

但如何我可以在下面的視圖中訪問這個包裝器來替換(直接調用)會話變量嗎?

@switch (Session["Culture"].ToString()) 
{  
    case "fr": 
     // ... 

    case "uk": 
     // ... 
} 
+3

你可以創建一個HTMLHelper擴展,你將使用會話包裝器... – sajoshi 2011-05-04 09:48:32

+0

@sajoshi:你是對的。我很愚蠢:(學習MVC) – Bronzato 2011-05-04 09:59:19

+0

關閉這個然後..並可能是+1的評論.. – sajoshi 2011-05-06 07:23:35

回答

2

你可以利用基本視圖:

public abstract class BaseViewPage : WebViewPage 
{ 
    public virtual ISessionWrapper SessionWrapper 
    { 
     get 
     { 
      return new SessionWrapper(); 
     } 
    } 
} 

public abstract class BaseViewPage<TModel> : WebViewPage<TModel> 
{ 
    public virtual ISessionWrapper SessionWrapper 
    { 
     get 
     { 
      return new SessionWrapper(); 
     } 
    } 
} 

你的觀點將有機會獲得SessionWrapper財產。

請確保將pageBaseType =「SessionWrapper」屬性添加到web.config中的頁面標記中。