Composite C1 - MVC Player конфликтует с модулем блога

У меня есть композитный сайт C1 - работает нормально. Некоторые страницы используют MVC Player - который работает нормально - вместе со всеми страницами на сайте - кроме Blog, который вызывает конфликт маршрутизации.

Error: The incoming request does not match any route.
C1 Function: Composite.AspNet.MvcPlayer.Render
Error details:
Exception has been thrown by the target of an invocation.
The incoming request does not match any route.

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

Как я могу заставить контроллер игнорировать блог - или исправить это другим способом?

1 ответ

Решение

Короткий ответ: оба элемента (блог и проигрыватель MVC) борются за часть пути вашего URL. Они оба ожидают, что им принадлежит путь в бит для маршрутизации.

Пример: /en/Blog/2011/11/29/Chamonix-To-Courmayeur-Skiing-Day-Trips

Часть /en/Blog направляет вас на страницу, на которой размещается ваш блог, а остальная часть - это информация о пути, которая передается любым функциям, которые вы могли разместить на странице. Поскольку путь "одна вещь", нет разницы, предназначена ли эта строка для функции блога или функции MVC Player. Это то, что создает путаницу.

Если вы хотите оставить блог как есть, вы можете обойти эту проблему двумя способами:

  1. Переместите функцию, имеющуюся в MVC Player, к другому поставщику функций, например, к функциям Razor.
  2. Измените MVC Player, чтобы он не передавал информацию о пути вашему контроллеру MVC.

Второй обходной путь может быть сделан быстро и грязно, редактируя ~/App_Code/Composite/AspNet/MvcPlayer/Player.cs и комментируя эту строку (строка 57)

Path = PathInfo;

Прежде чем сделать это, обратите внимание, что это повлияет на все ваши запущенные экземпляры MvcPlayer.

Чтобы создать новый альтернативный MvcPlayer, который не использует маршрутизацию (оставив исходный без изменений), сделайте следующее:

  1. копия Player.cs в NoRoutePlayer.cs (и соответственно переименуйте класс) и внесите вышеупомянутое изменение там (закомментируйте строку 57).
  2. Затем зарегистрируйте эту новую функцию в Composite C1, перейдя в Функции | C# Функции | Композитный | AspNet | MvcPlayer и добавьте сюда узел, используя существующий элемент Render в качестве вдохновения. Просто установите имя типа в NoRoutePlayer.

С этим изменением у вас будет функция Player и функция NonRoutingPlayer, и вы сможете использовать последний для запуска контроллера MVC, и все должны прекрасно ладить:)

Другие вопросы по тегам