未使用 IRouteProvider 和 RouteAttribute 调用 Orchard 控制器
Orchard controller not called using IRouteProvider and RouteAttribute
我正在使用 IRouterProvider 根据 this thread 中的建议从属性路由创建路由描述。调用路由器提供程序并获取路由。
我使用 Url.Action 辅助方法为这些特定操作生成 links,并且按预期为自定义路由生成了 url。但是,当导航到这样的 link 时,不会调用控制器。我得到了普通的 404。Orchard 甚至不在游戏中。
我的路线提供商看起来像:
public IEnumerable<RouteDescriptor> GetRoutes()
{
var type = typeof(ShoppingCartController);
foreach (var meth in type.GetMethods())
{
var attr = meth.GetCustomAttribute<System.Web.Mvc.RouteAttribute>();
if (attr != null)
{
yield return new RouteDescriptor
{
Priority = 100,
Name = string.Format("ShoppingCart{0}Route", meth.Name),
SessionState = System.Web.SessionState.SessionStateBehavior.Required,
Route = new Route(attr.Template,
new RouteValueDictionary
{
{ "area", "XXXX.Features" },
{ "controller", "ShoppingCart" },
{ "action", meth.Name }
},
new RouteValueDictionary(),
new RouteValueDictionary
{
{ "area", "XXXX.Features" }
},
new MvcRouteHandler())
};
}
}
}
我的控制器方法签名是:
[Themed]
[Route("cart/checkout")]
public ActionResult CheckOut() {...}
我试图调试问题,但我什至不知道从哪里开始。我对 Orchard 很陌生。
提前致谢
路由提供程序中的代码似乎没问题。您可以检查几项内容:
- 在不使用
RouteAttribute
的情况下对同一路线进行硬编码,看看这条路线是否通过。如果是这样,那么由于某种原因属性本身会把事情搞砸,最好的选择是模仿属性 class 并使用它来装饰动作。
- 如果上述方法不起作用,则问题出在路线本身。在这种情况下:
- 确保
area
参数正确且等于控制器所在的模块(而非功能)名称(即模块项目名称)。
- 对控制器和操作名称执行相同的操作
- 将路由优先级设置为
int.MaxValue
以确保它不会被其他路由劫持
- 尽量不要使用
Name
属性 and/or 确保它确实独一无二
我正在使用 IRouterProvider 根据 this thread 中的建议从属性路由创建路由描述。调用路由器提供程序并获取路由。
我使用 Url.Action 辅助方法为这些特定操作生成 links,并且按预期为自定义路由生成了 url。但是,当导航到这样的 link 时,不会调用控制器。我得到了普通的 404。Orchard 甚至不在游戏中。
我的路线提供商看起来像:
public IEnumerable<RouteDescriptor> GetRoutes()
{
var type = typeof(ShoppingCartController);
foreach (var meth in type.GetMethods())
{
var attr = meth.GetCustomAttribute<System.Web.Mvc.RouteAttribute>();
if (attr != null)
{
yield return new RouteDescriptor
{
Priority = 100,
Name = string.Format("ShoppingCart{0}Route", meth.Name),
SessionState = System.Web.SessionState.SessionStateBehavior.Required,
Route = new Route(attr.Template,
new RouteValueDictionary
{
{ "area", "XXXX.Features" },
{ "controller", "ShoppingCart" },
{ "action", meth.Name }
},
new RouteValueDictionary(),
new RouteValueDictionary
{
{ "area", "XXXX.Features" }
},
new MvcRouteHandler())
};
}
}
}
我的控制器方法签名是:
[Themed]
[Route("cart/checkout")]
public ActionResult CheckOut() {...}
我试图调试问题,但我什至不知道从哪里开始。我对 Orchard 很陌生。
提前致谢
路由提供程序中的代码似乎没问题。您可以检查几项内容:
- 在不使用
RouteAttribute
的情况下对同一路线进行硬编码,看看这条路线是否通过。如果是这样,那么由于某种原因属性本身会把事情搞砸,最好的选择是模仿属性 class 并使用它来装饰动作。 - 如果上述方法不起作用,则问题出在路线本身。在这种情况下:
- 确保
area
参数正确且等于控制器所在的模块(而非功能)名称(即模块项目名称)。 - 对控制器和操作名称执行相同的操作
- 将路由优先级设置为
int.MaxValue
以确保它不会被其他路由劫持 - 尽量不要使用
Name
属性 and/or 确保它确实独一无二
- 确保