ASP.NET 多门户结构的 MVC 5 自定义 RazorViewEngine

ASP.NET MVC 5 custom RazorViewEngine for multiple portal structure

我按类别设置我的 MVC 5 站点,然后是每个类别中的控制器、模型、视图子文件夹,即根文件夹文件夹 \Home 和 \Products 将包含这三个子文件夹以及一个根 \Shared\Views 文件夹。我关注了一篇很棒的文章,我的 Matthew Renz,Clean Architecture in ASP.NET MVC 5。部分通过创建自定义 RazorViewEngine 完成,具体而言:

public CustomRazorViewEngine()
    {
        ViewLocationFormats = new string[]
        {
            "~/{1}/Views/{0}.cshtml",
        };

        PartialViewLocationFormats = new string[]
        {
            "~/Shared/Views/{0}.cshtml"
        };
    } 

除此之外没有太多变化。我想知道我是否可以基于这个想法并使用一些标识符(名称或数字)为每个门户设置一个 \Portals 根文件夹和子文件夹的网站项目 - 类似于 DNN。对自定义 Razor 视图引擎代码的更改可能类似于:

public CustomRazorViewEngine()
    {
        ViewLocationFormats = new string[]
        {
            "~/Portals/{2}/{1}/Views/{0}.cshtml",
        };

        PartialViewLocationFormats = new string[]
        {
            "~/Portals/{2}/Shared/Views/{0}.cshtml"
        };
    }   

但是,我不确定值 {0} 和 {1} 从何而来。我可以找到获取门户网站名称 {2} 的方法。站点其余部分的相对路径,例如\Content、\Scripts 等。我相信我可以自己构建。

此方法的目的是向客户提供一种解决方案,在该解决方案中可以重复使用公共代码来支持大量具有独特外观和功能的门户。感谢您的时间和考虑,如果您有任何问题,请告诉我。

约翰

这些是字符串中的占位符,可用于控制器将区域名称、控制器名称或动作名称放入字符串中。 {2}是区域,{1}是控制器,{0}是动作。

您可能还想知道,在使用 Asp.Net Core 时,很容易让标准 Razor 视图引擎通过 ViewLocationExpander 在自定义位置定位视图等,而不需要创建继承自 Razor 视图引擎的新视图引擎。我之所以提到这一点,是因为您在问题中添加了 asp.net-core-mvc 标签。

这是一个堆栈溢出答案,显示了如何: