从 Action 内部获取将由 MVC Action 提供的 View 的物理位置的正确方法是什么?

我需要文件的最后修改时间来发送响应头。

最佳答案

获取 View 物理位置的正确方法是映射其虚拟路径。可以从 ViewPathBuildManagerCompiledView 属性中检索虚拟路径( 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/

10-12 03:08