Asp.net mvc Sitecore多站点MVC解决方案

Asp.net mvc Sitecore多站点MVC解决方案,asp.net-mvc,asp.net-mvc-4,sitecore,sitecore7,sitecore-mvc,Asp.net Mvc,Asp.net Mvc 4,Sitecore,Sitecore7,Sitecore Mvc,我是Sitecore MVC的新手,目前使用web表单,我将所有网站组织在: \Website\Sites\Site1\css|js|Layouts|Sublayouts|etc. \Website\Sites\Site{n}\css|js|Layouts|Sublayouts|etc. 我能够将MVC站点添加到我的解决方案中,并与web表单站点一起工作;但是,添加恰好具有相同控制器/视图名称的第二个MVC站点会产生冲突 例如,如果我为Site1创建一个控制器 Controllers/Site

我是Sitecore MVC的新手,目前使用web表单,我将所有网站组织在:

\Website\Sites\Site1\css|js|Layouts|Sublayouts|etc.
\Website\Sites\Site{n}\css|js|Layouts|Sublayouts|etc.
我能够将MVC站点添加到我的解决方案中,并与web表单站点一起工作;但是,添加恰好具有相同控制器/视图名称的第二个MVC站点会产生冲突

例如,如果我为Site1创建一个控制器

Controllers/Site1/FooController (has index and hello)
然后是:

Views/Foo/Index
Views/Foo/Hello
Views/Foo/Index
Views/Foo/Hello
但是,如果Site2也有一个同名的控制器,则这是一个冲突:

Controllers/Site2/FooController (has index and hello)
然后是:

Views/Foo/Index
Views/Foo/Hello
Views/Foo/Index
Views/Foo/Hello
但它们被Site1使用

问题是如何设置两个(或更多)恰好具有相同控制器/视图名称的MVC站点。是否有一种建议的方法来构造解决方案中的站点,或者我是否必须覆盖管道/处理器

谢谢

更新:

谢谢大家。区域解决了我的问题,但带来了两个新问题:

  • 控制器名称中的冲突通过将命名空间、类和dll名称放入Sitecore-reference中的控制器名称中来解决:

  • 当控制器返回视图时,我必须放置视图的完整路径;否则,我会在找不到视图的地方出错。 例如:返回视图(“~/Areas/Site1/Views/Home/Index.cshtml”)

  • 我正在研究Sitecore论坛的开发人员提供的修复程序:


    我会尝试一下,然后再报告。

    你需要在routes.MapRoute中使用名称空间,请看下面已经讨论过的帖子:

    下面是John west post的帖子,它描述了您的情况:


    您能做的最好的事情就是在同一个解决方案中将您的网站分成不同的项目。
    在同一个项目中构建两个网站可能会变得杂乱无章

    之后,您可以使用不同的名称空间路由具有相同名称的控制器


    我们也遇到了类似的问题,答案是将每个具有MVC区域的站点分离出来,它们可以完美地工作。虽然我们遇到了控制器名称重复的问题,但这可以通过在区域路由注册期间添加名称空间来解决

    但实现这一点的干净方法是让Sitecore知道MVC区域,并使用区域和命名空间初始化控制器/操作。这个过程已经被凯文写在博客上,他也有一个软件包。它要求您在控制器渲染中定义区域名称

    要避免视图的硬编码路径,始终可以扩展控制器渲染模板以添加视图路径,并创建操作过滤器以在执行操作后添加视图路径。在action filter中添加以下代码,并在sitecore action filter注册管道中注册该筛选器

    public void OnActionExecuted(ActionExecutedContext filterContext)
    { 
    
         ViewResult result= filterContext.Result as ViewResult;
         if(result == null) return;
    
         Rendering redering = RenderingContext.CurrentOrNull.With(x=>x.Rendering).Return(x=>x,null);
    
         string viewName= rendering.Return(r=> r.GetFieldValue(CustomMvcSettings.ViewPathField), string.Empty);
         if(String.IsnullOrEmpty(viewName)) return;
    
         result.ViewName = viewName;
    
    }
    

    为了让这个话题与SDN论坛保持同步

    我建议使用特定于sitecore的约束,如中所述


    此解决方案允许您在配置节点上设置属性mvcArea

    Hey Filip-然后如何合并Sitecore网站文件夹中的两个(或更多)项目?我假设所有项目的所有视图都将位于网站目录下的同一视图文件夹中?这取决于您自己想要如何构造它们。每个项目可以有两个独立的视图文件夹,或者一个视图文件夹,其中包含子文件夹“site1”和“site2”。