none
MVC3自定义ViewEngine,把视图文件放到别的目录下(本来是View目录),出错了 RRS feed

  • 问题

  • 我主要想达到的效果,自定义视图文件的位置

    我用MVC3默认的示例项目,自定义了一个ViewEngine。就是修改了视图文件的默认路径不在View文件夹了。

    改在“Themes/Default/”文件夹了。

    引用System.Web.Mvc的源码进行单步调试,得知错误产生在:BuildManager.GetObjectFactory(virtualPath, false)

    这个函数的功能应该就是把cshtml文件编译成一个类,具体怎么工作我就不清楚了。

    为什么View文件夹里的文件能编译,放别的目录就不行了呢?

    求高手指教,不胜感激!

     页面错误提示:当前上下文中不存在名称“ViewBag”

    2012年6月4日 10:28

答案

  • public class AdminRazorViewEngine : RazorViewEngine
        {
            public AdminRazorViewEngine()
            {
                base.MasterLocationFormats = new string[]
                {
                    "~/admin/{0}.cshtml",
                    "~/admin/shared/{0}.cshtml"
                };
                base.ViewLocationFormats = base.MasterLocationFormats;
                base.PartialViewLocationFormats = base.ViewLocationFormats;
            }
            public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
            {
                return base.FindView(controllerContext, viewName, masterName, useCache);
            }
            public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
            {
                return base.FindPartialView(controllerContext, partialViewName, useCache);
            }
        }

    你参考下我的定义...
    2012年6月8日 2:49
    版主

全部回复

  • 我也修改了引擎移动到外面了 没问题啊...你是怎么修改的???
    2012年6月6日 8:52
    版主
  • 1、自定义一个ViewEngine,继承自RazorViewEngine

    代码如下:

     public class ThemeRazorViewEngine : RazorViewEngine
        {
            public ThemeRazorViewEngine()
            {
                ViewLocationFormats = new[] {
                    "~/Themes/Default/{1}/{0}.cshtml"
                };
                MasterLocationFormats = new[] {
                    "~/Themes/Default/Shared/{0}.cshtml"
                };
                PartialViewLocationFormats = new[] {
                    "~/Themes/Default/Shared/{0}.cshtml",
                };

                FileExtensions = new[] {
                    "cshtml"
                };
            }

            protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
            {
                return new RazorView(controllerContext, partialPath,
                                     layoutPath: null, runViewStartPages: false, viewStartFileExtensions: FileExtensions, viewPageActivator: ViewPageActivator);
            }

            protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
            {
                var view = new RazorView(controllerContext, viewPath,
                                         layoutPath: masterPath, runViewStartPages: false, viewStartFileExtensions: FileExtensions, viewPageActivator: ViewPageActivator);
                return view;
            }
        }

    2、然后在Application_Start()里

    ViewEngines.Engines.Clear();

    ViewEngines.Engines.Add(new ThemeRazorViewEngine());

    3、其它文件就是默认的了,当然,Views里的文件按原路径移到Themes/Default文件夹里了

    PS:还有,在Views放一个图片或文本文件这类的静态文件,要直接访问也是不行的(一般放Content文件夹)。所以我想MVC应该是对Views文件夹有特定的处理了,不过我不知道是在哪处理了。

    2012年6月6日 9:04
  • public class AdminRazorViewEngine : RazorViewEngine
        {
            public AdminRazorViewEngine()
            {
                base.MasterLocationFormats = new string[]
                {
                    "~/admin/{0}.cshtml",
                    "~/admin/shared/{0}.cshtml"
                };
                base.ViewLocationFormats = base.MasterLocationFormats;
                base.PartialViewLocationFormats = base.ViewLocationFormats;
            }
            public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
            {
                return base.FindView(controllerContext, viewName, masterName, useCache);
            }
            public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
            {
                return base.FindPartialView(controllerContext, partialViewName, useCache);
            }
        }

    你参考下我的定义...
    2012年6月8日 2:49
    版主