Asp.net mvc MVC级联视图(路由)
我将着手构建一个概念验证应用程序,以取代老化的web表单应用程序 该应用程序是现成的,可根据每个客户进行定制。现有的解决方案包含所有主UI,以及客户请求的定制版本的页面 首席开发人员构建了一个技巧系统,该系统首先检查客户端目录中的页面版本,只有在没有找到页面版本时,才会返回基本版本 即第一次检查:Views\Client1\Home\Default 如果未找到匹配项,请选中:Views\Base\Home\Default 我的问题是,;虽然我相当肯定MVC能做到这一点,但我不知道如何开始。你能给我指一下正确的方向吗?(适当的教程,谷歌关键词等)Asp.net mvc MVC级联视图(路由),asp.net-mvc,asp.net-mvc-4,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc 4,Asp.net Mvc Routing,我将着手构建一个概念验证应用程序,以取代老化的web表单应用程序 该应用程序是现成的,可根据每个客户进行定制。现有的解决方案包含所有主UI,以及客户请求的定制版本的页面 首席开发人员构建了一个技巧系统,该系统首先检查客户端目录中的页面版本,只有在没有找到页面版本时,才会返回基本版本 即第一次检查:Views\Client1\Home\Default 如果未找到匹配项,请选中:Views\Base\Home\Default 我的问题是,;虽然我相当肯定MVC能做到这一点,但我不知道如何开始。你能给
谢谢大家 您正在寻找与类似的自定义视图引擎。但您的用例是不同的,因为它将根据加载您的应用程序的租户而需要不同的路径 我找到了我认为很适合你的情况的
public class MyRazorViewEngine : RazorViewEngine
{
public MyRazorViewEngine() : base()
{
AreaViewLocationFormats = new[] {
"~/Areas/{2}/Views/%1/{1}/{0}.cshtml",
"~/Areas/{2}/Views/%1/{1}/{0}.vbhtml",
"~/Areas/{2}/Views/%1/Shared/{0}.cshtml",
"~/Areas/{2}/Views/%1/Shared/{0}.vbhtml"
};
AreaMasterLocationFormats = new[] {
"~/Areas/{2}/Views/%1/{1}/{0}.cshtml",
"~/Areas/{2}/Views/%1/{1}/{0}.vbhtml",
"~/Areas/{2}/Views/%1/Shared/{0}.cshtml",
"~/Areas/{2}/Views/%1/Shared/{0}.vbhtml"
};
AreaPartialViewLocationFormats = new[] {
"~/Areas/{2}/Views/%1/{1}/{0}.cshtml",
"~/Areas/{2}/Views/%1/{1}/{0}.vbhtml",
"~/Areas/{2}/Views/%1/Shared/{0}.cshtml",
"~/Areas/{2}/Views/%1/Shared/{0}.vbhtml"
};
ViewLocationFormats = new[] {
"~/Views/%1/{1}/{0}.cshtml",
"~/Views/%1/{1}/{0}.vbhtml",
"~/Views/%1/Shared/{0}.cshtml",
"~/Views/%1/Shared/{0}.vbhtml"
};
MasterLocationFormats = new[] {
"~/Views/%1/{1}/{0}.cshtml",
"~/Views/%1/{1}/{0}.vbhtml",
"~/Views/%1/Shared/{0}.cshtml",
"~/Views/%1/Shared/{0}.vbhtml"
};
PartialViewLocationFormats = new[] {
"~/Views/%1/{1}/{0}.cshtml",
"~/Views/%1/{1}/{0}.vbhtml",
"~/Views/%1/Shared/{0}.cshtml",
"~/Views/%1/Shared/{0}.vbhtml"
};
}
protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
{
var nameSpace = controllerContext.Controller.GetType().Namespace;
return base.CreatePartialView(controllerContext, partialPath.Replace("%1", nameSpace));
}
protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
{
var nameSpace = controllerContext.Controller.GetType().Namespace;
return base.CreateView(controllerContext, viewPath.Replace("%1", nameSpace), masterPath.Replace("%1", nameSpace));
}
protected override bool FileExists(ControllerContext controllerContext, string virtualPath)
{
var nameSpace = controllerContext.Controller.GetType().Namespace;
return base.FileExists(controllerContext, virtualPath.Replace("%1", nameSpace));
}
}
不要将%1
替换为名称空间,而是将其替换为您的客户名称。然后将基本路径添加到所有位置的末尾,以确保始终在最后找到基本路径
确保将视图引擎添加到ViewEngines.Engines
集合中