从 Action 内部获取将由 MVC Action 提供的 View 的物理位置的正确方法是什么?
我需要文件的最后修改时间来发送响应头。
最佳答案
获取 View 物理位置的正确方法是映射其虚拟路径。可以从 ViewPath
的 BuildManagerCompiledView
属性中检索虚拟路径( RazorView
派生自该类,因此您的 IView
实例通常具有该属性)。
这是您可以使用的扩展方法:
public static class PhysicalViewPathExtension
{
public static string GetPhysicalViewPath(this ControllerBase controller, string viewName = null)
{
if (controller == null)
{
throw new ArgumentNullException("controller");
}
ControllerContext context = controller.ControllerContext;
if (string.IsNullOrEmpty(viewName))
{
viewName = context.RouteData.GetRequiredString("action");
}
var result = ViewEngines.Engines.FindView(context, viewName, null);
BuildManagerCompiledView compiledView = result.View as BuildManagerCompiledView;
if (compiledView != null)
{
string virtualPath = compiledView.ViewPath;
return context.HttpContext.Server.MapPath(virtualPath);
}
else
{
return null;
}
}
}
像这样使用它:
public ActionResult Index()
{
string physicalPath = this.GetPhysicalViewPath();
ViewData["PhysicalPath"] = physicalPath;
return View();
}
或者:
public ActionResult MyAction()
{
string physicalPath = this.GetPhysicalViewPath("MyView");
ViewData["PhysicalPath"] = physicalPath;
return View("MyView");
}
关于asp.net-mvc-3 - ASP.NET MVC3 Controller View 的物理位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10128684/