2011-06-22 33 views
5

當用戶訪問我的網站時,查詢字符串中可能會有一個template=foo傳入。該值正在驗證中並存儲在Session中。在MVC 3中的多個位置搜索.cshtml?

我的文件格式是這樣的:

- Views/ 
    - Templates/ 
    - test1/ 
     - Home 
     - Index.cshtml 
    - test2/ 
     - Home 
     - List.cshtml 
    - Home/ 
    - Index.cshtml 

基本上,如果用戶請求Indextemplate=test1,我想用Views/Templates/test1/Index.cshtml。如果他們有template=test2,我想用Views/Home/Index.cshtml(因爲/Views/Templates/test2/Home/Index.cshtml不存在)。如果他們沒有通過模板,那麼它應該直接去Views/Home

我是新來的MVC和.NET的一般,所以我不知道從哪裏開始尋找。我使用MVC3和Razor作爲視圖引擎。

+0

不知道它的工作原理,但嘗試返回視圖'返回查看(string.Concat(的Request.QueryString [ 「template」],「/ Index」))' –

+0

如果可能,更優雅的方法是從Controller類派生並覆蓋「View」方法 –

回答

1

您可以通過創建自定義RazorViewEngine並設置ViewLocationFormats屬性來實現此目的。 There's a sample here通過重寫WebFormViewEngine,但使用RazorViewEngine應該工作一樣好做它:

public class CustomViewEngine : WebFormViewEngine 
{ 
    public CustomViewEngine() 
    { 
     var viewLocations = new[] { 
      "~/Views/{1}/{0}.aspx", 
      "~/Views/{1}/{0}.ascx", 
      "~/Views/Shared/{0}.aspx", 
      "~/Views/Shared/{0}.ascx", 
      "~/AnotherPath/Views/{0}.ascx" 
      // etc 
     }; 

     this.PartialViewLocationFormats = viewLocations; 
     this.ViewLocationFormats = viewLocations; 
    } 
} 
1

您可以修改Scott Hanselman's Mobile Device demo以符合您的需求。與其檢查用戶代理或者它是否是移動設備,您可以將自己的邏輯放入查詢字符串或會話變量中。

+0

這適用於使用Razor視圖引擎嗎? –

+0

是的。你可以使用任何你想要的視圖引擎。這裏有一個例子,他使用Razor和Webforms。 – Chris