分析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;
}
}
}
红色部分就是要找的东西
重新自定义一下 按需修改即可