gpt4 book ai didi

c# - Sitecore、自定义 MVC Controller 和路由

转载 作者:行者123 更新时间:2023-11-30 14:27:48 25 4
gpt4 key购买 nike

我在 Sitecore 的网站定义中定义了一个网站。它的路径是 /localhost/mysite/home。并且有效。

我需要创建一个自定义 Controller 来提交带有绕过 Sitecore 的 API 的表单。所以我有 FormsController(继承自 MVC Controller ),其中包含一个名为“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);
}
}

最佳答案

这是我的一个项目中的一个工作示例。

自定义路由注册:

namespace Test.Project.Pipelines.Initialize
{
public class InitRoutes : Sitecore.Mvc.Pipelines.Loader.InitializeRoutes
{
public override void Process(PipelineArgs args)
{
RegisterRoutes(RouteTable.Routes);
}

protected virtual void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute(
"Test", // Route name
"api/test/{controller}/{action}/{id}", // URL with parameters
new { id = UrlParameter.Optional }
);
}
}
}

初始化管道配置:

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<pipelines>
<initialize>
<processor type="Test.Project.Pipelines.Initialize.InitRoutes, Test.Project"
patch:after="processor[@type='Sitecore.Mvc.Pipelines.Loader.InitializeRoutes, Sitecore.Mvc']" />
</initialize>
</pipelines>
</sitecore>
</configuration>

关于c# - Sitecore、自定义 MVC Controller 和路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31559784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com