【问题标题】:Routing in MVC not workingMVC中的路由不起作用
【发布时间】:2012-02-13 17:53:53
【问题描述】:

我有以下路线:

routes.MapRoute(
    "Property",
    "{language}/property/{propertyUrlId}",
    new { controller = "PropertyDetails", action = "Property" }

这是应该为该路由调用的控制器:

public class PropertyDetailsController : Controller
{
    public ActionResult Property(string language, string propertyUrlId)
    {

等等

以及应该使用该路由的以下 URL:

http://domain.com/en-us/property/3

相反,我得到 404。任何想法为什么?


这是我的路线:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapRoute(
        "Property",
        "property/{propertyUrlId}",
        //new { controller = "PropertyDetails", action = "Property" }, new { language = @"[a-zA-Z]{2}-[a-zA-Z]{2}" }
        new { controller = "PropertyDetails", action = "Property" }
    );
}

也不适用于语言或语言/国家/地区。

【问题讨论】:

  • 注册路由规则的顺序很重要。请按注册顺序向我们提供您正在创建的所有路线。
  • 即使在建议的更改之后,我仍然收到 404。还有什么我可以尝试的吗?
  • @AndrewBarber 您的评论不正确。如果它与另一条路线匹配,您将获得 404,例如mvc 默认路由 -> 控制器未知 -> 404
  • birdus:您需要发布您的整个路由定义集,以便我们查看是否有其他匹配。我仍然认为我删除的答案是你的问题,但因为你甚至不会尝试......
  • @AndrewBarber mvc 不关心名称。它只是遵循路由规则。想象一下你有默认路由。如果您访问 /controllerDoesNotExist/actionDoesNotExist 会发生什么? 404!为什么?因为路线是匹配的。

标签: asp.net-mvc model-view-controller routes


【解决方案1】:

首先,没有理由在路由中将 {language} 分成两块。正如你们中的一些人所说,这很好:

routes.MapRoute(
    "Property",
    "{language}/property/{propertyUrlId}",
    new { controller = "PropertyDetails", action = "Property" }

其次,我省略了一些对解决这个问题至关重要的信息。我没有想到在我的问题描述中包含这个,因为我不知道有任何关系。 MVC 项目位于一个解决方案中,该解决方案还包含一个使用 Sitecore CMS 作为其数据存储的网站(非 MVC)。 Sitecore 正在剥离 URL 的语言部分并将其存储起来。一旦我知道发生了这种情况,我就能够处理这个问题。

感谢您的所有意见,并对造成的混淆表示歉意。

【讨论】:

    【解决方案2】:

    考虑到您希望 url 的结构为:

    http://domain.com/en-us/property/3
    

    使用此路由:

    routes.MapRoute(
                "Property", // Route name
                "{language}/property/{propertyUrlId}", // URL with parameters
                new { controller = "PropertyDetails", action = "Property", propertyUrlId = UrlParameter.Optional } // Parameter defaults
            );
    

    如果你的 Global.asax 文件中有默认路由,像这样:

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

    将例程放在这段代码之上。

    你的控制器动作应该是这样的:

    public ActionResult Property(int propertyUrlId)
    {
     return View();
    }
    

    【讨论】:

      【解决方案3】:

      使用“en-us”作为 URL 的一部分是完全可以的。我猜你也注册了其他路线。尝试将此路由置于其他路由之上,至少在默认路由之上。

      我已经测试了这个场景,它对我来说效果很好。

      【讨论】:

      • 你的意思是我不需要把 en-us 分成两个参数?那么,我的问题似乎出在其他地方。这是我的 Global.asaxx 目前唯一的路线。
      【解决方案4】:

      您很可能在您的 Property 路由之前注册了默认路由。默认路由通常如下所示:

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

      只需在此默认路由之前注册您的 Property 路由即可。

      为什么会失败?(假设你确实是先注册默认路由)

      zh-cn -> 被解释为控制器

      property -> 被解释为动作

      因为您没有带有属性操作的 en-usController -> 404

      【讨论】:

      • @AndrewBarber 100% 确定。试试吧;-)
      • 我刚做了。当预期的路线不是第一个时,我得到一个 404,当它是第一个时,我得到一个正确调用的控制器动作。 +1
      • 但是,请注意,在对 superwalnut 的评论中,birdus 说问题中显示的路线是 only 路线......所以默认路线甚至不存在(如果birdus是正确的)
      • @AndrewBarber 我确实看到了该评论,但我相信这是最有可能的解释。我猜他的意思是,“这是我添加的唯一路线”。之前遇到过一些情况,人们认为默认路由永远不会被触摸/删除。
      • 我知道;我希望他能发布他拥有的路线。尽管我猜他是否正确,但他已经正确了。呵呵
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 2013-02-23
      相关资源
      最近更新 更多