ASP.NET MVC 5自定义RazorViewEngine用于多个门户结构

时间:2017-01-31 17:12:07

标签: asp.net-mvc-5 asp.net-core-mvc razorengine onion-architecture directory-structure

我按类别设置我的MVC 5站点,然后在每个类别中设置控制器,模型,查看子文件夹,即根文件夹文件夹\ Home和\ Products将具有这三个子文件夹以及根\ Shared \ Views夹。我跟着一篇很棒的文章,我的马修伦兹,Clean Architecture in ASP.NET MVC 5。通过创建自定义RazorViewEngine来完成,具体来说:

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

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

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

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等。我相信我可以自己构建。

此方法的目的是向客户端提供一种解决方案,其中可以重用公共代码以支持具有独特外观和功能的多个门户。感谢您的时间和考虑,如果您有任何疑问,请与我们联系。

约翰

1 个答案:

答案 0 :(得分:2)

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

您可能也有兴趣知道,在使用Asp.Net Core时,很容易通过ViewLocationExpander获得标准Razor View Engine以在自定义位置查找视图,而不需要创建新的视图引擎继承自Razor View Engine。我只提到这个,因为你在你的问题上添加了asp.net-core-mvc标签。

这是一个堆栈溢出答案,显示如何: How to specify the view location in asp.net core mvc when using custom locations?