Мультисайт Sitecore с MVC не работает

System.InvalidOperationException: найдено несколько типов, соответствующих контроллеру с именем «Home». Это может произойти, если маршрут, который обслуживает этот запрос ('{*pathInfo}'), не указывает пространства имен для поиска контроллера, соответствующего запросу. Если это так, зарегистрируйте этот маршрут, вызвав перегрузку метода «MapRoute», который принимает параметр «пространства имен».

Запрос «Дом» обнаружил следующие соответствующие контроллеры: SitecoreMVC.Areas.Site1.Controllers.HomeController SitecoreMVC.Areas.Site2.Controllers.HomeController

Выше приведена ошибка, которую я также получаю при использовании MVCAreas. Я расширил шаблон рендеринга контроллера и добавил еще два поля: Area и Namespace, а во время инициализации маршрута я выполняю AreaRegistration.RegisterAllAreas();

Я также расширил GetRendererProcessor с помощью своего собственного процессора, и я получаю сообщение об ошибке в controllerrunner в методе выполнения, поскольку компилятор не может разрешить правильный контроллер, в приведенном ниже пространстве имен и области кода передается, но все равно выдает ошибку.

AreaControllerRenderer.cs

 public class AreaControllerRenderer : Renderer
{
    public string Action { get; set; }
    public string Controller { get; set; }
    public string Area { get; set; }
    public string Namespaces { get; set; }

    public override string CacheKey
    {
        get
        {
            return "areacontroller::" + Controller + "#" + Action + "#" + Area + "#" + Namespaces;
        }
    }

    public override void Render(System.IO.TextWriter writer)
    {
        var controllerRunner = new AreaControllerRunner(Controller, Action, Area, Namespaces);

        string value = controllerRunner.Execute();
        if (string.IsNullOrEmpty(value))
        {
            return;
        }
        writer.Write(value);
    }

    public override string ToString()
    {
        return "Controller: {0}. Action: {1}. Area {2}. Namespaces {3}".FormatWith(new object[]
        {
            Controller,
            Action,
            Area,
            Namespaces
        });
    }
}

Пожалуйста помоги!!

Мне удалось решить эту проблему, используя полное имя контроллера с именем сборки, как показано ниже -
SitecoreMVC.Areas.Site1.Controllers.HomeController, SitecoreMVC


person Paritosh Tripathi    schedule 18.11.2015    source источник
comment
какую версию Sitecore вы используете?   -  person Vlad Iobagiu    schedule 18.11.2015
comment
Альпинист @sitecore — я использую Sitecore 8.0   -  person Paritosh Tripathi    schedule 18.11.2015


Ответы (3)


Sitecore ControllerFactory в настоящее время не позволяет иметь несколько контроллеров с одинаковым именем. Вы должны выбрать другое имя для каждого контроллера или добавить полное имя вашего контроллера (включая сборку) в ваш рендеринг контроллера:

SitecoreMVC.Areas.Site1.Controllers.HomeController, SitecoreMVC
person Kevin Brechbühl    schedule 18.11.2015
comment
Спасибо за ответ. Если я правильно понял, мне нужно поместить SitecoreMVC.Areas.Site1.Controllers.HomeController в рендеринг контроллера, верно? - person Paritosh Tripathi; 18.11.2015
comment
Я попытался использовать полное имя контроллера при рендеринге контроллера, но теперь он выдает ошибку: [ExceptionWrapper: контроллер для пути '/' не найден или не реализует IController.] [ControllerCreationException: не удалось создать контроллер: ' SitecoreMVC.Areas.Site1.Controller.Home'. Элемент контекста: '/sitecore/content/Site1'. - person Paritosh Tripathi; 18.11.2015
comment
@ParitoshTripathi попробуйте также добавить имя сборки: SitecoreMVC.Areas.Site1.Controllers.HomeController, AssemblyName - person Kevin Brechbühl; 18.11.2015
comment
Я также пытался использовать имя сборки, но все равно та же ошибка - [InvalidOperationException: не удалось создать экземпляр контроллера из имени типа: «SitecoreMVC.Areas.Site1.Controller.HomeController, SitecoreMVC»] Sitecore.Mvc.Controllers.ControllerRunner.CreateControllerUsingReflection () +326 Sitecore.Mvc.Controllers.ControllerRunner.GetController() +24 Sitecore.Mvc.Controllers.ControllerRunner.Execute() +54 Framework.Sc.Extensions.MvcAreas.AreaControllerRenderer.Render(программа записи TextWriter) в d:\Projects \SitecoreMVC_Soln\Sitecore.Extensions\MvcAreas\AreaControllerRenderer.cs:32 - person Paritosh Tripathi; 18.11.2015
comment
Я что-то упускаю? Пожалуйста, помогите. - person Paritosh Tripathi; 18.11.2015
comment
@ParitoshTripathi теперь это другое сообщение об ошибке ;-) В сообщении об ошибке я вижу в вашем пространстве имен .Controller. вместо .Контроллеров. (см. отсутствующие s). Вы уверены, что ввели правильное пространство имен и имя класса для рендеринга контроллера? - person Kevin Brechbühl; 19.11.2015
comment
Эй, спасибо, Кевин, причиной была глупая опечатка. Это сработало, но теперь есть еще одна деталь: загружаемый сайт — это Site1, независимо от того, я изменил URL-адрес с dev.site1.com или dev.site2.com. - person Paritosh Tripathi; 19.11.2015
comment
Я отредактировал вопрос с текущей проблемой сейчас. Пожалуйста, посмотрите и скажите мне, если я что-то пропустил в этом. Надеюсь нет... - person Paritosh Tripathi; 19.11.2015
comment
@ParitoshTripathi Я думаю, что это еще одна проблема, не связанная с этим вопросом. Не могли бы вы пометить ответ как принятый и открыть новый вопрос? - person Kevin Brechbühl; 19.11.2015

Вы можете ограничить пространства имен для поиска на каждом sitecore-site при использовании решения, о котором я писал в блоге: http://www.chrisvandesteeg.nl/2014/06/13/sitecore-mvc-in-a-multisite.-environment-areas/

Что возвращает ваш ToString() при вызове метода Render?

person Chris van de Steeg    schedule 18.11.2015
comment
Я также попробовал ваш блог, но переменная scRoute всегда имеет значение null, поскольку переменная MvcSettings.SitecoreRouteName устанавливается из Sitecore.MVC.Config, а значение по умолчанию — ‹setting name=Mvc.SitecoreRouteName value=Sitecore /› И метод рендеринга ToString() возвращает - Контроллер: SitecoreMVC.Areas.Site1.Controller.HomeController, SitecoreMVC. Действие: Индекс. Район Сайт1. Пространства имен SitecoreMVC.Areas.Site1.Controller - person Paritosh Tripathi; 19.11.2015
comment
Пользовательские начальные маршруты находятся в конце конвейера инициализации? Попробуйте «фантастический» способ zzzz, такой как zzzz.initializeroutes.config, чтобы быть уверенным, что он будет включен последним. - person Chris van de Steeg; 19.11.2015

В Sitecore 8.1 области MVC поддерживаются из коробки, возможно, вы можете использовать Sitecore 8.1 вместо 8.0 http://ctor.io/new-in-sitecore-8-1-mvc-areas/

person Jan Bluemink    schedule 18.11.2015
comment
На самом деле я знаю, что это работает в Sitecore 8.1, но я хотел попробовать его в более ранних версиях. Спасибо за ваше предложение. - person Paritosh Tripathi; 19.11.2015