【问题标题】:ActionLink/RouteLink not using specified actionNameActionLink/RouteLink 未使用指定的 actionName
【发布时间】:2016-10-16 16:48:31
【问题描述】:

EuroControllerIndex.cshtml 视图中,我有一个 ActionLink 我想使用 Euro 控制器的“IndexByYear”操作:

@Html.ActionLink("Year 2006", "IndexByYear","Euro", new { id = "", year = 2006 }, null)

但问题是它转到了 Index() 方法,即使它是在 RouteConfig 上设置的所有内容:

routes.MapRoute(
     name: "Default",
     url: "{controller}/{id}",
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
     );
routes.MapRoute(
     name: "Euro",
     url: "{controller}/{year}/{id}",
     defaults: new { controller = "Euro", action = "IndexByYear", year = DateTime.Now.Year, id = UrlParameter.Optional }
     );

这是 EuroController

    public ActionResult Index(int? id)
    {
     ...
    }
    public ActionResult IndexByYear(int? id, int year)
    {
     ...
    }

这也不起作用,因为它也适用于 Index() 方法:

@Html.RouteLink("Ano 2006","Euro",new { id = "", year = 2006 },null)

如果我手动导航到 domain/Euro/2016/1,则它使用正确的路线。似乎没有参数它通过默认路由。

我的问题是,为什么 ActionLink 不使用指定的 IndexByYear,或者 RouteLink 使用指定的默认(欧元)路由?

【问题讨论】:

  • 交换路线的顺序。
  • 如果我这样做,domain/ 会显示 EuroController 的 Index(),而不是 HomeController。
  • 那是因为您已经用修改后的版本替换了包罗万象的路线。将Euro 改回Home。如果您只想匹配该特定路由,请创建一个副本,将 {controller} 占位符替换为 euro
  • 所以你的意思是我应该更改默认值:new { controller = "Euro"....} TO 默认值:new { controller = "Home" 。 ...} ?

标签: asp.net-mvc routes actionlink


【解决方案1】:

如果您希望 EuroController 具有“特殊”路由,您可能需要执行以下操作:

routes.MapRoute(
     name: "Euro",
     url: "euro/{year}/{id}",
     defaults: new { controller = "Euro", action = "IndexByYear", year = DateTime.Now.Year, id = UrlParameter.Optional }
     );

routes.MapRoute(
    name: "DefaultNoController",
    url: "{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    constraints: new { isMethodInHomeController = new RootRouteConstraint<Controllers.HomeController>() }
    );

routes.MapRoute(
     name: "Default",
     url: "{controller}/{action}/{id}",
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
     );

约束的定义如下:

public class RootRouteConstraint<T> : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        var rootMethodNames = typeof(T).GetMethods().Select(x => x.Name.ToLower());
        return rootMethodNames.Contains(values["action"].ToString().ToLower());
    }
}

这将匹配

  • domain/euro/1 EuroController 上的 Index 操作
  • domain/euro/2008/1 EuroController 上的 IndexByYear 操作
  • domain/ HomeController 上的 Index 操作
  • domain/about HomeController 上的 About 操作
  • domain/someothercontroller 对您定义的任何其他控制器的索引操作

您可能想阅读https://msdn.microsoft.com/en-us/library/cc668201.aspxhttps://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/creating-a-custom-route-constraint-cs

【讨论】:

    猜你喜欢
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多