【发布时间】:2016-05-24 07:26:46
【问题描述】:
有没有办法同时使用约定和属性路由? 我想在定义属性路由的时候,用方法和控制器的真实名称调用一个动作方法。
映射方法在启动时调用:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();///
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
这里是控制器:
[RoutePrefix("d")]
[Route("{action=index}")]
public class DefaultController : Controller
{
[Route]
public ActionResult Index()
{
return View();
}
[Route("f")]
public ActionResult Foo()
{
return View();
}
}
我可以通过/d/f url 访问 Foo 操作方法。但是当我尝试这个 url:/Default/Foo 时,就会出现 404 错误。实际上它会抛出动作未找到异常,如A public action method 'Foo' was not found on controller 'Namespace...DefaultController'.
我检查了asp.net mvc的源代码,我看到了这些行:
if (controllerContext.RouteData.HasDirectRouteMatch())
{
////////
}
else
{
ActionDescriptor actionDescriptor = controllerDescriptor.FindAction(controllerContext, actionName);
return actionDescriptor;
}
它检查是否存在直接路由,其中/Default/Foo 路由不是直接路由,因此它应该充当在启动时注册为{controller}/{action}/{id} 的约定路由。但它没有找到 controllerDescriptor.FindAction 方法的操作,并引发异常。
这是一个错误还是我不能同时使用这两种路由方法?或者有什么解决方法可以同时使用这两种方法?
编辑
我调试到mvc源代码,看到这几行:
namespace System.Web.Mvc
{
// Common base class for Async and Sync action selectors
internal abstract class ActionMethodSelectorBase
{
private StandardRouteActionMethodCache _standardRouteCache;
protected void Initialize(Type controllerType)
{
ControllerType = controllerType;
var allMethods = ControllerType.GetMethods(BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public);
ActionMethods = Array.FindAll(allMethods, IsValidActionMethod);
// The attribute routing mapper will remove methods from this set as they are mapped.
// The lookup tables are initialized lazily to ensure that direct routing's changes are respected.
StandardRouteMethods = new HashSet<MethodInfo>(ActionMethods);
}
关于属性路由的最后一个 cmets 解释了为什么会出现这个问题。当您调用MapMvcAttributeRoutes 时,属性路由会删除StandardRouteMethods。
我仍在寻找解决方法。
【问题讨论】:
-
你找到解决办法了吗?
标签: c# asp.net-mvc asp.net-mvc-5 asp.net-mvc-routing