【发布时间】:2018-07-22 05:52:09
【问题描述】:
我正在尝试使用具有[InheritedRoute] 属性的基本控制器。基类和控制器是这样创建的:
[InheritedRoute("app/{controller}/{action=index}/{id?}")]
public abstract class MyBaseController : Controller
{
public ActionResult Index()
{
return View();
}
}
public class DefaultController : MyBaseController { }
public class KyleController : MyBaseController { }
[RoutePrefix("app/support")]
[Route("{action=Index}/{id?}")]
public class SupportController : Controller
{
public ActionResult Index()
{
return View();
}
}
InheritedRouteAttribute 类和东西:
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class InheritedRouteAttribute : Attribute, IDirectRouteFactory
{
public string Name { get; set; }
public int Order { get; set; }
public string Template { get; }
public InheritedRouteAttribute(string template)
{
this.Template = template;
}
public RouteEntry CreateRoute(DirectRouteFactoryContext context)
{
var controllerDescriptor = context.Actions.First().ControllerDescriptor;
var controllerName = controllerDescriptor.ControllerName;
string template;
if (string.Equals(controllerName, "Default", StringComparison.OrdinalIgnoreCase))
{
template = this.Template.Replace("{controller}/", string.Empty);
}
else
{
template = this.Template.Replace("{controller}", controllerName);
}
IDirectRouteBuilder builder = context.CreateBuilder(template);
builder.Name = this.Name ?? controllerName + "_Route";
builder.Order = this.Order;
return builder.Build();
}
}
public class InheritedDirectRouteProvider : DefaultDirectRouteProvider
{
protected override IReadOnlyList<IDirectRouteFactory> GetControllerRouteFactories(ControllerDescriptor controllerDescriptor)
{
return controllerDescriptor.GetCustomAttributes(typeof(IDirectRouteFactory), true).Cast<IDirectRouteFactory>().ToArray();
}
}
在我的 RouteConfig.cs 中,我没有使用常规路由:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes(new InheritedDirectRouteProvider());
}
本质上,我想这样做,如果用户在DefaultController 中,则从 URL 中删除“默认”一词;否则,使用以“app”开头的标准约定。如果我去掉默认值(通过去掉 {controller}/),那么每当我转到另一个 URL 时,我都会收到多个控制器类型错误。但是,如果我离开它,一切都很好,只是 URL 不是我想要的。
我正在查看 RouteDebugger 并查看注册为我的路线的内容,我看到了(如我所料):
- app/Kyle/{action}/{id}
- app/support/{action}/{id}
- app/{action}/{id}
我错过了什么?为什么它认为我有重复的路线,特别是在SupportController 和DefaultController?
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-5 routes asp.net-mvc-5.2 attributerouting