【问题标题】:ASP.Net MVC3 Routing IssueASP.Net MVC3 路由问题
【发布时间】:2012-10-25 19:15:06
【问题描述】:

我在一个交易网站上工作,并在 global.asax 中定义了以下路线。

routes.MapRoute(
    "AboutFooter",
    "about-bicker-shop",
    new { controller = "Footer", action = "About" }
);

routes.MapRoute(
    "ContactFooter",
    "contact-bickershop",
    new { controller = "Footer", action = "Contact" }
);

routes.MapRoute(
    "PrivacyPolicyFooter",
    "privacy-policy",
    new { controller = "Footer", action = "PrivacyPolicy" }
);

routes.MapRoute(
    "TermsAndConditionsFooter",
    "terms-and-conditions",
    new { controller = "Footer", action = "TermsAndConditions" }
);

routes.MapRoute(
    "SiteMapFooter",
    "sitemap",
    new { controller = "Footer", action = "SiteMap" }
);

routes.MapRoute(
    "FAQFooter",
    "faq",
    new { controller = "Footer", action = "FAQ" }
);

routes.MapRoute(
    "UnsubscribeFooter",
    "unsubscribe",
    new { controller = "Footer", action = "Unsubscribe" }
);

routes.MapRoute(
    "GetDealsByCity",
    "daily-bickers/{cityName}",
    new { controller = "Home", action = "Home" }
);

routes.MapRoute(
    "GetDealsbyCategory",
    "daily-bickers/{cityname}/{category}",
    new { controller = "Home", action = "GetDealsByCategory" }
);

routes.MapRoute(
    "GetDealDetails",
    "{cityName}/{dealName}",
    new { controller = "Home", action = "GetDealsByDealName" }
);

routes.MapRoute(
    "DealCheckout",
    "{cityName}/{dealName}/checkout",
    new { controller = "Home", action = "CheckoutDealByDealName" }
);

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

在我查看交易详情之前它工作正常,但是当我点击购买按钮购买交易时出现错误。

在进一步研究中,我发现在点击购买按钮时,代码调用的是GetDealsByDealName 操作,而不是CheckoutDealByDealName 操作。请给我建议解决方案。

【问题讨论】:

  • 需要查看链接的生成方式以了解它们可能无法正确路由的原因。
  • 您可以张贴您正在使用的操作链接或按钮的标记吗?
  • 生成以下链接 - http://{url}/{controller}/{action}?cityname="{cityname}anddealname="{dealname}/checkout 而我的期望是 http: //{url}/{cityname}/{dealname}/checkout

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing


【解决方案1】:

MVC 将始终提供它可以在路由表中找到的与请求的路由匹配的第一个路由。在这种情况下,您获得错误路由的原因是它们都匹配GetDealDetails 路由。即使第二条路线更具体,它也永远无法到达,因为GetDealDetails 将始终首先匹配。尝试像这样重新排序您的路线:

routes.MapRoute(
    "DealCheckout",
    "{cityName}/{dealName}/checkout",
    new { controller = "Home", action = "CheckoutDealByDealName" }
);

routes.MapRoute(
    "GetDealDetails",
    "{cityName}/{dealName}",
    new { controller = "Home", action = "GetDealsByDealName" }
);

这应该允许详细信息路线与结帐路线不匹配,但结帐将在碰撞期间首先被捕获。我真的建议你完全重命名你的路线,但看看你有什么我可以理解你为什么想要这些路线。

【讨论】:

  • 按照建议,我尝试重新排序路线但没有成功。仍然出现同样的错误。
  • 我尝试将路线重命名为 routes.MapRoute( "DealCheckout", "{cityName}/{dealName}/checkout", new { controller = "Home", action = "CheckoutDealByDealName" } );但这也没有奏效。看来我别无选择,只能彻底改变路线。
  • 将路由更改为checkout/{cityName}/{dealName} 可能会取得更大的成功。这会改变路线,使其变得独一无二,但它看起来仍然非常接近您的初衷。
  • 即使尝试了相同的路由但它不起作用,可能是因为两个操作具有相同的签名,并且可能是 mvc 路由考虑了操作签名而不是要形成的完整 url。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
相关资源
最近更新 更多