У меня есть сайт, определенный в определениях сайта Sitecore. Путь к нему: /localhost/mysite/home
. И это работает.Sitecore, пользовательские контроллеры и маршруты MVC
Мне нужно создать пользовательский контроллер для отправки форм с API в обход Sitecore. Таким образом, у меня есть FormsController
(наследующий от контроллера MVC) действие с именем «Тест» без параметров.
Я определил маршрут в инициализации трубопровода, как это:
public class Initialize
{
public void Process(PipelineArgs args)
{
MapRoutes();
GlassMapperSc.Start();
}
private void MapRoutes()
{
RouteTable.Routes.MapRoute(
"Forms.Test",
"forms/test",
new
{
controller = "FormsController",
action = "Test"
},
new[] { "Forms.Controller.Namespace" });
}
}
маршрут добавляется в таблицу маршрутизации правильно, и это там, когда я его отладки. Теперь, когда я пытаюсь вызвать метод «тест», маршрут не найден, и отладчик не попадает в точку останова в действии.
Я пытаюсь разные маршруты:
/localhost/mysite/home/forms/test
/localhost/forms/test
(веб-сайт по умолчанию)
Но не везло до сих пор.
---- UPDATE ---
Углубляясь в него, я заметил, что там что-то не так с поведением Sitecore в. Процессор TransferRoutedRequest
должен прервать конвейер httpRequestBegin
, отдав управление обратно MVC, если элемент контекста является нулевым (упрощает). Это происходит после некоторых проверок, среди которых одно из данных RoutTable. Но вызов RouteTable.Routes.GetRouteData
всегда возвращает значение null, что возвращает процессор без прерывания конвейера. Я перепробовал его, чтобы он корректно прерывал конвейер, но все же, даже если он называет метод args.AbortPipeline()
, конвейер не прерывается и маршрут не разрешается.
это как оригинальный TransferRoutedRequest
выглядел как:
public class TransferRoutedRequest : HttpRequestProcessor
{
public override void Process(HttpRequestArgs args)
{
Assert.ArgumentNotNull((object) args, "args");
RouteData routeData = RouteTable.Routes.GetRouteData((HttpContextBase) new HttpContextWrapper(HttpContext.Current));
if (routeData == null)
return;
RouteValueDictionary routeValueDictionary = ObjectExtensions.ValueOrDefault<Route, RouteValueDictionary>(routeData.Route as Route, (Func<Route, RouteValueDictionary>) (r => r.Defaults));
if (routeValueDictionary != null && routeValueDictionary.ContainsKey("scIsFallThrough"))
return;
args.AbortPipeline();
}
}
и это, как я отменяю его:
public class TransferRoutedRequest : global::Sitecore.Mvc.Pipelines.HttpRequest.TransferRoutedRequest
{
public override void Process(HttpRequestArgs args)
{
if (Context.Item == null || Context.Item.Visualization.Layout == null)
args.AbortPipeline();
else
base.Process(args);
}
}
Вы копируете мой (нерабочий) пример с добавлением ** НЕПРАВИЛЬНОЙ практики **: для изменения метода «Application_Start». У меня нет доступа к глобальному асаку, и даже если бы у меня было, я бы не стал его трогать. Правильный способ сделать это через инициализацию конвейера, добавив конфигурацию в папку App_Config/include. Или, в качестве второго варианта, путем украшения вашего собственного класса init с помощью 'assembly: PreApplicationStartMethod' – Hellraiser
Конечно, я понимаю, что лучше избегать модификаций global.asax.cs, по крайней мере для целей обслуживания - http: //sirchicken.blogspot .co.uk/2014/07/leave-globalasax-in-sitecore-untouched.html - Я просто упростил его для понимания. Пример фрагмента - это ** рабочий ** код, поскольку я его заранее проверил –
Вы читали то, что я написал? Это тот же пример, который вы написали, но это не работает для меня. Итак, дело в том, что я знаю, как работает обычная программа, но в моем случае это не работает. Итак, в чем смысл отвечать обычным методом? Кроме того: вы создали новую конфигурацию сайта в sitecore? Если да, проверили ли вы свой метод на новом созданном веб-сайте? Я так не думаю ... – Hellraiser