分析Action对应的路径

默认Views下面对应的各个Controller对应的xxx.cshtml

实际情况中 

情况1 : 如果多站在一起的时候,用Area来分类  效果 ~Areas/OA/Views/Controller/Action.cshtml

情况2 : 如果在Views下建立OA文件夹Action.cshtml   效果~/Views/Controller/OA/Action.cshtml 

             这样的情况用 自定义viewEngine

通常我们想要的是第3中情况  先上效果 ~/Views/OA/Controller/Action.cshtml 

解决办法是 用继承RazorViewEngine

 

首先明确三点

1 MVC默认一个控制器工厂(ControllerFactory)

2 控制器工厂是由ControllerBuilder创建的    怎么创建不考虑

3 控制器工厂来找对应的View   怎么找法不考虑

 

 

看了1下ControllerBuilder代码 在构造方法中 

        internal ControllerBuilder(IResolver<IControllerFactory> serviceResolver) {
            _serviceResolver = serviceResolver ?? new SingleServiceResolver<IControllerFactory>(
                () => _factoryThunk(),
                 new DefaultControllerFactory { ControllerBuilder = this },
                "ControllerBuilder.GetControllerFactory"
            );
        }

发现了一个东西DefaultControllerFactory   其实之前我是知道控制器工厂叫DefaultControllerFactory 

 

下面通过DefaultControllerFactory来寻找View的

找到大家都说的那些获取控制器的类型和创建控制器

public virtual IController CreateController(RequestContext requestContext, string controllerName)

protected internal virtual Type GetControllerType

之外   146行 可疑性很大   return ControllerActivator.Create(requestContext, controllerType);

不过继续F12失望了

 

既然没有找到 那就直接找ViewEngine

看源代码类集合发现了3个类 ViewEngineCollection   ViewEngineResult  ViewEngines

ViewEngineResult 

 public ViewEngineResult(IView view, IViewEngine viewEngine)

 顾名思义  通过IView IViewEngine 构造 View ViewEngine

 

ViewEngines 有2个iewEngine   WebFormViewEngine 和 RazorViewEngine(其实RazorViewEngine就是要找的东西,只是现在还不知道)

public static class ViewEngines {

        private readonly static ViewEngineCollection _engines = new ViewEngineCollection {
            new WebFormViewEngine(),
            new RazorViewEngine(),
        };

        public static ViewEngineCollection Engines {
            get {
                return _engines;
            }
        }
    }

 

ViewEngineCollection实现了IViewEngine中的FindView FindParticalView  

(在Action中 通常有View和ParticalView这二种对应的输出)

通过F12得知最终都会走向Find方法    

private ViewEngineResult Find(Func<IViewEngine, ViewEngineResult> lookup, bool trackSearchedPaths)

。。。。 result = lookup(engine);

根据IViewEngine接口得到ViewEngineResult

 

这只是定义 那具体的ViewEngine都在ViewEngineCollection的Engines

 

下面在去WebFormViewEngine中

WebFormViewEngine继承BuildManagerViewEngine

--模板字符串 和 CreatePartialView CreateView 我们要找FindView 其实通过名字来看Create其实就是想要的

 

BuildManagerViewEngine 继承 VirtualPathProviderViewEngine

从名字中看应该找不到想要的东西

 

VirtualPathProviderViewEngine 实现 IViewEngine 已经到终点了

想找的东西应该就这里吧

 

      protected abstract IView CreatePartialView(ControllerContext controllerContext, string partialPath);

      protected abstract IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath);

 

        public virtual ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache) {
           。。。。

           。。。。            

            return new ViewEngineResult(CreatePartialView(controllerContext, partialPath), this);
        }

        public virtual ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) {
           。。。。

            。。。。

            return new ViewEngineResult(CreateView(controllerContext, viewPath, masterPath), this);
        }

 

 

再看下RazorViewEngine

 

    public class RazorViewEngine : BuildManagerViewEngine {
        internal static readonly string ViewStartFileName = "_ViewStart";

        public RazorViewEngine()
            : this(null) {
        }

        public RazorViewEngine(IViewPageActivator viewPageActivator)
            : base(viewPageActivator) {
            AreaViewLocationFormats = new[] {
                "~/Areas/{2}/Views/{1}/{0}.cshtml",
                "~/Areas/{2}/Views/{1}/{0}.vbhtml",
                "~/Areas/{2}/Views/Shared/{0}.cshtml",
                "~/Areas/{2}/Views/Shared/{0}.vbhtml"
            };
            AreaMasterLocationFormats = new[] {
                "~/Areas/{2}/Views/{1}/{0}.cshtml",
                "~/Areas/{2}/Views/{1}/{0}.vbhtml",
                "~/Areas/{2}/Views/Shared/{0}.cshtml",
                "~/Areas/{2}/Views/Shared/{0}.vbhtml"
            };
            AreaPartialViewLocationFormats = new[] {
                "~/Areas/{2}/Views/{1}/{0}.cshtml",
                "~/Areas/{2}/Views/{1}/{0}.vbhtml",
                "~/Areas/{2}/Views/Shared/{0}.cshtml",
                "~/Areas/{2}/Views/Shared/{0}.vbhtml"
            };

            ViewLocationFormats = new[] {
                "~/Views/{1}/{0}.cshtml",
                "~/Views/{1}/{0}.vbhtml",
                "~/Views/Shared/{0}.cshtml",
                "~/Views/Shared/{0}.vbhtml"
            };
            MasterLocationFormats = new[] {
                "~/Views/{1}/{0}.cshtml",
                "~/Views/{1}/{0}.vbhtml",
                "~/Views/Shared/{0}.cshtml",
                "~/Views/Shared/{0}.vbhtml"
            };
            PartialViewLocationFormats = new[] {
                "~/Views/{1}/{0}.cshtml",
                "~/Views/{1}/{0}.vbhtml",
                "~/Views/Shared/{0}.cshtml",
                "~/Views/Shared/{0}.vbhtml"
            };

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

        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: true, viewStartFileExtensions: FileExtensions, viewPageActivator: ViewPageActivator);
            return view;
        }
    }
}

 

红色部分就是要找的东西

重新自定义一下 按需修改即可

 

 

 

 

posted @ 2012-03-02 01:40  Ry5  阅读(442)  评论(0编辑  收藏  举报