ASP.NET MVC2路由约束 - 可选的数字id参数

时间:2010-12-09 23:06:09

标签: asp.net-mvc asp.net-mvc-2 constraints custom-routes

我在ASP.NET MVC2项目中设置了默认路由,并希望为其他一些控制器添加/修改它。假设我有一个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”的东西,它不会抛出错误但将它们带到错误页面...

还有this post提示设置默认值,但我不知道该怎么做...

3 个答案:

答案 0 :(得分: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”的调用使用第二条路线,同样地,并且调用“客户/购买/橙色“使用第三条路线,不会尝试以这种方式验证身份证。我是否理解您正在尝试做的事情?让我知道这种方法是否有效。

答案 1 :(得分:2)

在与数字ID匹配的IgnoreRoute之后添加IgnoreRoute,该数字ID将忽略对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
);

答案 2 :(得分:0)

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

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