4

我在我的 ASP.NET MVC2 项目中设置了默认路由,并希望为我的其他一些控制器添加/修改它。假设我有一个带有 Details 操作的 Customer 控制器,该控制器期望和“id”参数(int)。例如:

    //
    // GET: /Customer/Details/5
    public ActionResult Details(int id)
    {
      //...
    }

如果用户输入“非数字”,如何添加将返回 404 的路由?我尝试添加以下“之前”默认路由,但它不起作用......

    routes.MapRoute(
        "DefaultDigitsId", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index" },
        new { id = @"\d+" }
        );

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

注意,如果可能的话,我想保留默认路由......我所有的控制器都使用“详细信息”和“编辑”,其中需要“id”(int)参数。我想知道是否有办法完成这无需指定多个路由(即通用的)......当然,目标是如果用户输入类似“/Customer/Details/apple”之类的内容,它不会引发错误,而是将它们带到错误页面.. .

还有这篇文章提示设置默认值,但我不知道该怎么做......

4

3 回答 3

3

我还没有尝试过,但您可能想尝试一下:

routes.MapRoute(
    "DefaultDetails",
    "{controller}/Details/{id}",
    new { controller = "Home", action = "Details" },
    new { id = @"\d+" }
    );

routes.MapRoute(
    "DefaultEdit",
    "{controller}/Edit/{id}",
    new { controller = "Home", action = "Edit" },
    new { id = @"\d+" }
    );

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

我希望“Customer/Details/1”使用第一个路由(它将 id 验证为数字,对“Customer/Edit/1”的调用使用第二个,同样如此,对“Customer/Buy”的调用/Orange" 使用第三条路线,它不会尝试以这种方式验证 ID。我是否理解您要正确执行的操作?如果这种方法有效,请告诉我。

于 2010-12-09T23:57:28.073 回答
2

在匹配数字 id 之后添加一个 IgnoreRoute,它将忽略对 Customer 控制器上 Details 操作的任何请求:

routes.MapRoute(
  "DefaultDigitsId", // Route name
  "{controller}/{action}/{id}", // URL with parameters
  new { controller = "Home", action = "Index" },
  new { id = @"\d+" } // match numeric id
);

routes.IgnoreRoute("Customer/Details/{*pathInfo}");

routes.MapRoute(
  "Default", // Route name
  "{controller}/{action}/{id}", // URL with parameters
  new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
于 2010-12-09T23:28:03.297 回答
0

任何无法解析为字符串的值都会使 id 值在调用时为空,因此如果 id 不为空,您可以重定向到错误页面。

另一种可能性是注册一个全局过滤器,检查是否有一个名为 id 的参数,如果它为空,则重定向到错误页面

于 2010-12-09T23:18:31.320 回答