2009-12-09 75 views
2

我有一個單獨的工具類,在控制器中調用,並且我需要訪問Views文件夾內的文件。視圖{控制器}內有幾個包含不同視圖的子文件夾。我正在尋找的東西類似於使用:如何使用ASP.NET MVC獲取當前視圖的物理文件夾?

HttpContext.Current.Request.PhysicalApplicationPath 

獲取驅動器上的物理文件夾。

我試着使用:

HttpContext.Current.Request.MapPath(HttpContext.Current.Request.Path); 

但只是映射到實際上並沒有退出物理路徑(即所請求的途徑,如果我要求「/汽車/型號/ 123」,它會返回「。 C:\ AppPath \ Cars \ Models \ 123 \')

任何想法?

+0

我不確定您可以直接從請求路徑執行此操作。請求路徑映射到一個控制器,然後它可以加載任何視圖,而不僅僅是它自己的視圖子文件夾中的視圖。 你究竟想要做什麼? – 2009-12-09 18:50:08

+0

我已根據加載頁面的移動設備(即iPhone視圖存儲在\ Views \ {controller} \ iPhone \\中)定製了從特定子文件夾加載視圖的WebFormViewEngine。即時嘗試訪問存儲在那裏的xslt文件。與不同設備視圖對應的每個子文件夾都存儲有不同的xslt文件。 – prototypef 2009-12-09 19:04:06

回答

1

在弄亂了RouteValueDictionary,RouteData,RequestContext和各種Route類之後,我幾乎已經準備好放棄並硬編碼了。前段時間我開始這個項目,所以我忘記了WebFormViewEngine的定製我完成了課程。我會繼續發佈我的解決方案,儘管我意識到它可能不是最優雅,安全或實用的(就最佳實踐而言)。

首先我有extendend的WebFormViewEngine類和覆蓋了FindView方法:

public class CustomViewEngine : WebFormViewEngine 
{ 
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
{ 
    ViewEngineResult result = null; 
    var request = controllerContext.HttpContext.Request; 

    // modify stuff here 

    result = base.FindView(controllerContext, viewName, masterName, useCache); 

    return result; 
} 
} 

我所做的是一個靜態屬性添加到我的實用工具類,像這樣:

public static string CurrentViewPath { get; set; } 

和修改FindView方法以捕獲ViewEngineResult並獲取ViewPath:

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
{ 
    ViewEngineResult result = null; 
    var request = controllerContext.HttpContext.Request; 

    // modify stuff here 

    result = base.FindView(controllerContext, viewName, masterName, useCache); 

    System.Web.Mvc.WebFormView wfvView = (System.Web.Mvc.WebFormView)result.View; 
    HelperFunctions.CurrentViewPath = wfvView.ViewPath.Replace(viewName + ".aspx",""); 

    return result; 
} 

這給了我視圖的虛擬路徑,這正是我所需要的。剩下要做的唯一事情就是回到實用工具類,並使用HttpContext.Current.Request.MapPath方法來獲得的,其中當前視圖文件的完整物理路徑:

string ViewPath = HttpContext.Current.Request.MapPath(CurrentViewPath); 

和賓果!

這是有點迂迴的hackish辦法做到這一點,卜嘿,如果它的工作原理...

感謝您的幫助和有益的建議每一個人。

0

該框架是獨立的,所以我會使用框架使用的相同的搜索算法。找到應用程序的根目錄,然後查看視圖文件夾。它應該在與控制器相關的文件夾或共享文件夾中。使用RouteValueDictionary訪問控制器。

+0

我該如何填充當前路由的RouteValueDictionary對象? – prototypef 2009-12-09 20:28:32

+0

RouteValueDictionary是Controller(RouteData)的屬性。你不需要填充它,它會免費填充你的路由參數。只需提取值並將它們傳遞給您的實用方法。 – tvanfosson 2009-12-09 21:06:41

相關問題