2012-07-22 59 views
3

說我有,有一個視圖的路徑路由超值,喜歡地圖MVC查看路由值到物理路徑

new 
{ 
    controller = "Home", 
    action = "Index" 
} 

我怎麼這個映射到~/Views/Home/Index.cshtml

我知道並不是所有的觀點都必然有一個行動,並不是所有的行爲都必然會返回一個觀點,所以這可能證明是一個問題。

更新:

也許是這樣的:

IView view = ViewEngines.Engines.FindView(ControllerContext, "Index").View; 
view.GetViewPath(); 

但是,讓我來指定,而不是假設我想用我的controllerContext(或者甚至嘲諷了controllerContext爲控制器控制器(字符串)欲..

+0

我聽不懂。 MVC內置路由系統有什麼問題? – Tohid 2012-07-23 00:25:31

+0

內置路由系統很好,但我需要將'viewName' /'controller'對轉換回物理路徑,以簡化呈現部分視圖的方法所採用的參數,而不必傳遞完整的物理路徑,現在我可以傳遞'viewName'和'controller'名稱。 – bevacqua 2012-07-23 01:03:23

回答

2

下面是我已經做到了:

private string GetPhysicalPath(string viewName, string controller) 
{ 
    ControllerContext context = CloneControllerContext(); 

    if (!controller.NullOrEmpty()) 
    { 
     context.RouteData.Values["controller"] = controller; 
    } 
    if (viewName.NullOrEmpty()) 
    { 
     viewName = context.RouteData.GetActionString(); 
    } 
    IView view = ViewEngines.Engines.FindView(viewName, context).View; 
    string physicalPath = view.GetViewPath(); 
    return physicalPath; 
} 

GetViewPath擴展方法是:

public static string GetViewPath(this IView view) 
{ 
    BuildManagerCompiledView buildManagerCompiledView = view as BuildManagerCompiledView; 
    if (buildManagerCompiledView == null) 
    { 
     return null; 
    } 
    else 
    { 
     return buildManagerCompiledView.ViewPath; 
    } 
} 

CloneControllerContext是:

private ControllerContext CloneControllerContext() 
{ 
    ControllerContext context = new ControllerContext(Request.RequestContext, this); 
    return context; 
} 
+0

從來沒有聽說過'.NullOrEmpty()'方法! – Tohid 2012-07-23 08:55:12

+1

只是'string.IsNullOrEmpty'的語法糖,它是一個擴展方法。 – bevacqua 2012-07-23 14:15:44

+0

什麼是'GetActionString'?無法解決它。 – hofnarwillie 2015-01-12 10:50:57

0

從RazorViewEngine.cs(在MVC3源),用於視圖搜索路徑如下(假設剃刀):

ViewLocationFormats = new[] { 
     "~/Views/{1}/{0}.cshtml", 
     "~/Views/{1}/{0}.vbhtml", 
     "~/Views/Shared/{0}.cshtml", 
     "~/Views/Shared/{0}.vbhtml" 
    }; 

{1}引用控制器的路由值,而{0}是視圖名稱(不是路由值的一部分)。

您可以搜索這些位置以嘗試找到符合您的標準的視圖,但您還需要了解您正在製作的假設數量......即,該視圖具有與該操作相同的名稱(默認情況下爲yes,但如果您在控制器操作的View中調用中指定視圖名稱,則不會)。你提到了幾個其他的假設已經

+0

我不假設任何東西。 – bevacqua 2012-07-23 00:40:41

+0

你已經假設該視圖與你在這裏發佈的答案中的動作名稱相同:viewName = context.RouteData.GetActionString(); – 2012-07-23 04:55:45

+0

這不是假設任何東西,這是Mvc自己的約定,如果你返回View(),你得到的視圖映射到被請求的動作,我需要類似的東西。 – bevacqua 2012-07-23 05:24:35