【发布时间】:2015-10-12 03:08:26
【问题描述】:
我在 Sitecore 的网站定义中定义了一个网站。它的路径是/localhost/mysite/home。它有效。
我需要创建一个自定义控制器来提交带有绕过 Sitecore 的 API 的表单。所以我有 FormsController(从 MVC 控制器继承),其中一个名为“Test”的操作不带任何参数。
我在初始化管道中定义了这样的路由:
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" });
}
}
路由已正确添加到路由表中,当我调试它时它就在那里。 现在,当我尝试调用方法“test”时,找不到路由,调试器也没有命中操作中的断点。
我正在尝试不同的路线:
/localhost/mysite/home/forms/test-
/localhost/forms/test(默认网站)
但到目前为止还没有运气。
---- 更新 ---
深入研究后,我注意到 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);
}
}
【问题讨论】:
标签: c# routing asp.net-mvc-5 sitecore sitecore7