Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC2路由约束-可选编号id参数_Asp.net Mvc_Asp.net Mvc 2_Constraints_Custom Routes - Fatal编程技术网

Asp.net mvc ASP.NET MVC2路由约束-可选编号id参数

Asp.net mvc ASP.NET MVC2路由约束-可选编号id参数,asp.net-mvc,asp.net-mvc-2,constraints,custom-routes,Asp.net Mvc,Asp.net Mvc 2,Constraints,Custom Routes,我在ASP.NET MVC2项目中设置了默认路由,并希望为我的其他一些控制器添加/修改它。假设我有一个客户控制器,其中包含预期的详细操作和“id”参数(int)。例如: // // GET: /Customer/Details/5 public ActionResult Details(int id) { //... } 如果用户输入“非号码”,如何添加将返回404的路由? 我尝试添加以下“之前”默认路线,但它不起作用 routes.

我在ASP.NET MVC2项目中设置了默认路由,并希望为我的其他一些控制器添加/修改它。假设我有一个客户控制器,其中包含预期的详细操作和“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”之类的内容,它不会抛出错误,而是将它们带到错误页面


还有设置默认值的提示,但我不确定如何设置…

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


另一种可能是注册一个全局筛选器,该筛选器检查是否有名为id的参数,如果该参数为null,则重定向到错误页面,在与数字id匹配的参数之后添加一个IgnoreRoute,该参数将忽略对客户控制器上的详细信息操作的任何请求:

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
);

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

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。我是否理解您试图正确执行的操作?让我知道此方法是否有效。

当id param未声明为null时,如何检查它是否为null?此外,我希望我不必将其声明为“int?id”,以便检查它是否为null(然后尝试对其进行分析)…你是对的,我没有注意到。它使用int?或上面发布的其他解决方案。我认为将参数声明为int?将是较小的弊病,因为这将允许路由系统完成其工作。在控制器中,当值为null或找不到数值时,您需要返回错误。这可能是一个不错的选择方法考虑到您很可能需要验证int值以查看它是否是有效ID。@Hector我不得不恭敬地不同意您的意见:)在我看来,将参数标记为null able只是为了测试其有效性,应该是“作业”我有一个基于id获取客户的业务服务,如果找不到,则抛出业务异常(CustomerNotFoundException),我可以在控制器中捕获该异常。但这是“业务级别验证”而不是“mvc参数验证”…不同的关注点…@zam6ak也许你可以与开发MVC框架的人分享这一点,我认为你的观点是正确的。例如,在Play!framework(Java MVC框架)中如果无法解析该值,路由器将返回一个错误。我是否必须为所有其他操作和控制器添加忽略项…大约有5个控制器,每个控制器至少有2个操作需要“id”…并且它将增长…如果您只想接受数字id,只需将“/{id}”从“默认”路由器中去掉:)我刚才在回复@StriplingWarriorSo的评论时也有同样的想法,“Customer/Details/1”应该使用DefaultDigitsId路由,“Customer/Details/apple”应该给你一个404,对吗?您希望哪些URL使用您的默认路由?我猜类似于/Customer/Index或/Customer/Create…我明白您的意思…您是在暗示我可以从默认路由中删除“id”,因为它不会被使用吗?我并不是真的想说明一点:只要理解您要执行的行为即可。好的。您的方法比使用带有约束的路由(与默认路由相同,但id与regex匹配)和使用默认路由,但从中删除id要好一点。谢谢