Asp.net mvc 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能做到这一点,但我不知道如何开始。你能给

我将着手构建一个概念验证应用程序,以取代老化的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
集合中