2010-01-26 44 views
8

我的ASP.NET MVC控制器動作都裝飾有許多與這類似的通過使用C#指令

[OutputCache(Duration = 86400, Location = OutputCacheLocation.Client, 
     VaryByParam = "jsPath;ServerHost")] 
    [CompressFilter] 
    public JavaScriptResult GetPendingJavaScript(string jsPath, string serverHost) 

啓用ASP.NET MVC應用程序「調試模式」,我想什麼做的是用#if和#endif來包裝它,並在我的web.config文件中設置DebugMode。當此設置設置爲true時,裝飾屬性應該被忽略 - 我想啓用調試模式,並且在調試模式下不應該進行壓縮和緩存。

所以基本上它會像註釋掉那些裝飾性(就是我現在正在做的和厭倦了它):

//[OutputCache(Duration = 86400, Location = OutputCacheLocation.Client, 
    // VaryByParam = "jsPath;ServerHost")] 
    //[CompressFilter] 

顯然的#if和#endif工作與自定義(#定義)C#符號,我找不到任何示例,這可以與其他類型的條件(如web.config值等)一起工作。

幫助表示讚賞

回答

2

取而代之的是,我會利用Web Deployment Projects,並在web.configconfigSource屬性。

我將web.config分成兩個文件,每個組件。例如,您的輸出緩存將被拆分爲outputcache.dev.configoutputcache.live.config。您應該輸入配置源作爲dev配置文件。

你的dev.config基本上會告訴你的應用程序你不想緩存運行(enableOutputCache="false")。

然後,當您運行部署項目時,可以使用設置替換dev.config字符串,而不是使用live.config。

More discussion on configSource and Web Deployment Projects

至於你的CompressFilter問題......嗯,我只是在你的配置文件中有一個應用程序設置值。繼分裂配置文件之後,您將擁有appsettings.dev.configappsettings.live.config

<add key="InLiveMode" value="false" /> 

而在你live.config,沒錯,你猜對了:在你的開發,像你這樣有什麼

<add key="InLiveMode" value="true" /> 

然後,當您使用的屬性,你可以簡單地反對InLiveMode應用程序設置。

FYI:我更喜歡有某種facade類,所以我不對付魔術字符串中的代碼,但是爲了簡單起見,你必須是這樣的:

//CompressFilter class 
public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    bool inLiveMode = bool.Parse(ConfigurationManager.AppSettings["InLiveMode"]); 

    if(inLiveMode) 
    { 
    //Do the compression shiznit 
    } 
} 
+0

耶that0s涼爽,最有可能的路要走,我會做這樣的。 – mare 2010-01-27 01:12:19

0

對不起,.NET中沒有任何東西會導致代碼的不同部分根據運行時配置文件中的內容進行編譯。