在弄亂了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辦法做到這一點,卜嘿,如果它的工作原理...
感謝您的幫助和有益的建議每一個人。
我不確定您可以直接從請求路徑執行此操作。請求路徑映射到一個控制器,然後它可以加載任何視圖,而不僅僅是它自己的視圖子文件夾中的視圖。 你究竟想要做什麼? – 2009-12-09 18:50:08
我已根據加載頁面的移動設備(即iPhone視圖存儲在\ Views \ {controller} \ iPhone \\中)定製了從特定子文件夾加載視圖的WebFormViewEngine。即時嘗試訪問存儲在那裏的xslt文件。與不同設備視圖對應的每個子文件夾都存儲有不同的xslt文件。 – prototypef 2009-12-09 19:04:06