如何为剃刀引擎使用绝对路径进行搜索?

时间:2018-07-11 00:02:50

标签: asp.net-mvc razor asp.net-mvc-5 razorengine

我有多个写在ASP.NET MVC框架顶部的项目。这些项目中的每一个都使用通用的视图和编辑器模板。因此,我必须将诸如编辑器模板和主布局之类的通用视图复制到本地计算机上的每个项目中。

在本地运行应用程序时,有没有一种方法来包含重复的视图而不是使用~来确定视图的路径呢?

换句话说,不是使用~/CustomViews/Shared/{0}.cshtml之类的方法,而是使用c:\\MyProjects\\CommonViews\\Views\\Shared\\EditorTemplates\\{0}.cshtml告诉剃刀引擎在哪里搜索?

仅当我的运行环境是开发人员或在本地主机上运行时,才包括绝对路径。

我试图创建自己的引擎来扩展RazorViewEngine

public class CustomViewEngine : RazorViewEngine
{
    public CustomViewEngine()
        : base()
    {
        ViewLocationFormats = GetGlobalViews();
    }

    public string[] GetGlobalViews()
    {
        var views = new List<string>();

        if (Running on localhost...)
        {
            var baseDirectory = new DirectoryInfo(System.Web.HttpContext.Current.Server.MapPath("~"));
            var root = baseDirectory.Parent.Parent.Parent;
            var viewsPath = Path.Combine(root.FullName, "CommonViews", "Views");

            if (Directory.Exists(viewsPath))
            {
                // include the Views directory
                views.Add(viewsPath.ToString() + "/{1}/{0}.cshtml");

                // include the Views/Shared directory
                var sharedViewsPath = Path.Combine(viewsPath, "Shared");
                views.Add(sharedViewsPath.ToString() + "/{1}/{0}.cshtml");

                // include the Views/Shared/EditorTemplates directory
                var editorTemplatesViewsPath = Path.Combine(sharedViewsPath, "EditorTemplates");
                views.Add(editorTemplatesViewsPath.ToString() + "/{1}/{0}.cshtml");
            }
        }

        return views;
    }
}

然后在我的应用程序的Application_Start方法中,添加了以下代码以使用CustomViewEngine

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new CustomViewEngine());

但是当由于该视图不存在而导致系统错误时,搜索到的绝对浴都不会列出

注意:我不必担心部署问题或生产环境问题,我只希望它在本地工作。

0 个答案:

没有答案