ASP.Net MVC 2 RC2:当所有可选参数为空时,自定义路由返回 404

Posted

技术标签:

【中文标题】ASP.Net MVC 2 RC2:当所有可选参数为空时,自定义路由返回 404【英文标题】:ASP.Net MVC 2 RC2: Custom route returns 404 when all optional parameters are null 【发布时间】:2011-01-18 21:05:03 【问题描述】:

当我使用以下路由导航到以下 URL 时收到 404 错误:

http://localhost:53999/properties/

但是,以下所有内容都正确路由到我的控制器中的 List 操作:

http://localhost:53999/properties/usa/new-york/manhattan/12

http://localhost:53999/properties/usa/new-york/manhattan

http://localhost:53999/properties/usa/new-york

http://localhost:53999/properties/usa

public static void RegisterRoutes(RouteCollection routes)

    routes.IgnoreRoute("resource.axd/*pathInfo");

    //properties
    routes.MapRoute(
        "Properties",
        "Properties/country/state/city/id",
        new
        
            controller = "Properties",
            action = "List",
            country = UrlParameter.Optional,
            state = UrlParameter.Optional,
            city = UrlParameter.Optional,
            id = UrlParameter.Optional
         
    );

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

在 PropertiesController.cs 中:

public ActionResult List(string country, string state, string city, string id)

     return View();

有人知道我错过了什么吗?看起来它应该只是去默认操作,但它显然没有......

【问题讨论】:

【参考方案1】:

布拉德威尔逊在这篇文章中回答了这个问题:http://forums.asp.net/p/1527697/3690295.aspx#3690295

“不,问题是您的磁盘上有一个 Properties 文件夹,因此它通过标准调度程序(而不是 MVC)进行调度,然后因为找不到默认文档而出现 404。”

【讨论】:

【参考方案2】:

你试过 Phil Haack 的 Route Debugger 吗?它可以帮助您确定发生了什么。

【讨论】:

谢谢,是的,实际上我刚刚尝试过,它似乎可以识别正确的控制器和操作,但它仍然会抛出 404。这可能是一个错误,因为我能够通过更改从“属性”到其他任何内容的前导路由关键字。可能是关键字被保留或其他什么......不知道。我用不同的前导路由关键字测试了整个东西,它工作得很好。很奇怪,但它现在正在工作。 :)【参考方案3】:

您也可以尝试以下方法(因为您使用的是 MVC 1.0)。

在当前路线上方添加路线:

routes.MapRoute(
    "Properties", "Properties", new  controller = "Properties", action = "List" 
);

并向控制器添加重载的ActionResult List() 方法:

public ActionResult List()

     return View();

【讨论】:

我也以为他在使用 MVC 1.0 :) 但他在标题中说 MVC 2。奇怪的是我们都错过了。 我完全按照您的方式尝试了它,但是 VS 抱怨我已经有一个名为“Properties”的路由,所以我将其更改为“DefaultProperties”以赋予它不同的东西。不幸的是,当我直接访问 localhost:53999/properties 时,我仍然得到 404。但是,一旦我有一个可选参数的值,它就会被路由到操作没有问题。附:是的,我正在使用 MVC 2 RC2..【参考方案4】:

而不是通过

(string)null

尝试通过

UrlParameter.Optional

如 Phil Haacks 帖子 here 中所述。我不知道这是否能解决问题,因为我目前无法对其进行测试。

【讨论】:

这在 MVC 1.0 中不可用。 请注意,UrlParameter.Optional 仅适用于 2 月初刚刚发布的 MVC 2 RC 2。 @çağdaş:OP 专门说 MVC 2。 @Dan Atkinson 啊,我在评论之前又看了一遍帖子正文,但显然不是标题。 我用 UrlParameter.Optional 尝试过(这就是我从现在开始的方式,谢谢 Simon),但是当我转到 localhost:53999/properties 时它仍然返回 404

以上是关于ASP.Net MVC 2 RC2:当所有可选参数为空时,自定义路由返回 404的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 5 中的路由可选参数

ASP.NET MVC 传递多个可选参数 field=value

具有 HTML5 模式和 ASP.Net MVC 的 AngularJS 可选 URL 参数

如何使用 ASP.NET Core RC2 MVC6 和 IIS7 获取当前 Windows 用户

ASP.NET Core RC2 IIS 在选项请求上返回 502

ASP.NET 5 RC 2:UrlRouting 设置(不包含MVC6的UrlRouting设置)