在搞砸了 RouteValueDictionary、RouteData、RequestContext 和各种 Route 类之后,我几乎准备放弃并硬编码我的方式。我不久前开始了这个项目,所以我忘记了对 WebFormViewEngine 类的自定义我已经完成了。我将继续发布我的解决方案,即使我意识到它可能不是最优雅、最安全或最实用的(就最佳实践而言)。
首先我扩展了 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);
还有宾果游戏!
这是一种迂回的骇人听闻的方式,嘿,如果它有效的话......
感谢大家的帮助和有用的建议。