2016-01-20 60 views
0

我想構建一種在運行時覆蓋ASP.NET MVC視圖的方法。基本想法是有MyView.cshtml和和可選MyView.Override.cshtml。一旦MyView.Override.cshtml存在於磁盤上,它將被用來代替原始視圖。使用File.Exists()檢查視圖是否存在於磁盤上

我試圖做的是:

protected new ActionResult View(string viewName) 
{ 
    var overridePath = viewName.Replace(".cshtml", ".Override.cshtml"); // i.e. ~/Views/MyView.Override.cshtml 

    if (System.IO.File.Exists(Server.MapPath(overridePath))) 
    { 
     return base.View(overridePath); // use override 
    } 

    return base.View(viewName); // use default 
} 

這基本上工作。我的問題:在解析視圖時,使用File.Exists()是否是好習慣?這是否會引入任何問題(靈活性,性能)?我錯過了一種標準的MVC方式來做同樣的事情嗎?

回答

1

如果您希望在應用程序中爲每個頁面提供這種可能性,那麼已經有一種方法可以做到這一點,稱爲DisplayModeProvider。這種情況的典型用例是具有移動或瀏覽器特定的視圖。

例如,您可以設置一個Index.Mobile.cshtml,並且如果內置提供程序確定請求瀏覽器是基於用戶代理字符串的移動設備,則它將返回該視圖而不是Index.cshtml 。

但是,您可以通過create your own供應商添加額外的供應商,無論出於何種原因您都會返回。

內您的啓動或Global.asax中(取決於OWIN,等等),你將要添加以下代碼:

DisplayModeProvider.Instance.Modes.Insert(1, new DefaultDisplayMode("Override") 
{ 
    // Make it always try this 
    ContextCondition = (ctx => true)  
}); 

有了這個代碼,它總是試圖返回XXXX。 Override.cshtml視圖。如果不存在,它將回到常規視圖。

+1

正是我需要的!謝謝。 此外,顯示模式提供程序似乎有一個更聰明的方法來檢查文件是否存在,通過在應用程序啓動時執行而不是每次解析視圖時都存在。 –

相關問題