2012-03-09 42 views
0

我已經設置了顯示模式在應用程序啓動事件作爲ASP.NET MVC 4種精確視圖名稱移動顯示模式

DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("iPhone"){ 
ContextCondition = (context => 
    context.GetOverriddenUserAgent().IndexOf( 
     "iPhone", 
     StringComparison.OrdinalIgnoreCase) >= 0) }); 

然後在控制器我有返回查看,我指定視圖名稱:

返回查看( 「〜/查看/普通/用戶/ Login.cshtml」,視圖模型);

如果我訪問的頁面從iPhone將直接進入登錄查看

如果我不指定視圖名稱:

return View(viewModel); 

在這種情況下,從iPhone我看看Login.iPhone.cshtml

問題:是否可以指定視圖的名稱,但是一些DisplayModeProvider如何選擇普通或iPhone版本n的cshtml文件?

+0

還沒有嘗試過MVC4,但你有沒有試過指定視圖的完整路徑,而只是視圖名稱。 '返回View(「Login」,viewModel);'使用MVC3和啓用移動設備的視圖引擎,它將爲移動設備選擇'Login.Mobile.cshtml'視圖,爲非移動設備選擇'Login.cshtml'視圖。 – tvanfosson 2012-03-09 03:41:18

+0

不幸的是,我們有一些特殊路徑的意見,所以我們需要提供絕對路徑。所以默認viewName(基於操作)和共享文件夾中視圖的名稱是可以的,但絕對路徑不是。 – Maxim 2012-03-09 19:38:19

回答

0

我通常不喜歡復活的老問題,但因爲這一個從未回答,這是一個我特別麻煩找到答案對自己說,它可能是值得擁有的別人誰在同樣的來回答問題。

您可以將您的其他位置添加到您正在使用的ViewEngines的ViewLocationFormats和PartialViewLocationFormats集合中。這樣,你可以只指定視圖名稱tvanfosson建議和MVC將正確地找到該文件,它應該允許移動壓倒一切的工作它的魔力。

下面是一些代碼,我用它來重寫PartialViewLocationFormats,你也可以做到使用ViewLocationFormats相同。這是在Global.asax中添加的Application_Start

  ViewEngines.Engines.Clear(); 
      var razorViewEngine = new RazorViewEngine 
      { 
       PartialViewLocationFormats = new[] 
       { 
        "~/Views/{1}/{0}.cshtml", 
        "~/Views/Shared/{0}.cshtml", 
        "~/Views/{1}/EditorTemplates/{0}.cshtml", 
        "~/Views/{1}/DisplayTemplates/{0}.cshtml", 
        "~/Views/Shared/DisplayTemplates/{0}.cshtml" 
       } 
      }; 

由於這種方法涉及清除viewengines採集,則需要在所有locationFormats,甚至通用的標準添加,對正在使用的所有視圖引擎的一部分。