ASP.NET MVC Route不使用约束

时间:2010-02-11 22:13:15

标签: asp.net-mvc routes asp.net-mvc-routing

我无法使路由工作,以便将控制器操作的参数限制为仅为整数。

我有一个控制器动作如下:

    [RequiresRole(RoleToCheckFor = "Administrator"), AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Edit(int id)
    {
       ...
    }

以及Global.asax.cs中的以下路由:

        routes.MapRoute(
            "UserEdit",       
            "user/edit/{id}",       
            new {controller = "user", action = "edit"},   
            new {id = @"\d+"}
            );

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

        routes.MapRoute("Error",
                "{*url}",
                new { controller = "Error", action = "notfound" });

因此,我希望如果我输入http://domain.com/user/edit/ABCD不应该获得以下常见错误:

参数字典包含非可空类型'System.Int32'的参数'id'的空条目,用于方法'System.Web.Mvc.ActionResult Edit(Int32)'

这(我认为)恰恰也是http://www.asp.net/%28S%28pdfrohu0ajmwt445fanvj2r3%29%29/learn/mvc/tutorial-24-cs.aspx

所说的

但是,我仍然看到“...空条目...”错误。

为什么会这样?我的路线设置有问题吗?

由于

3 个答案:

答案 0 :(得分:3)

你的第二条路线

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

正在抓住它并且不受约束。

使用Phil Haacks route debugger for such issues

答案 1 :(得分:1)

正如保罗指出的那样,正确地跳过了路线,因为约束不匹配。因此,路由系统继续到下一个路由并尝试匹配它。因为第二条路线不受约束,所以它将匹配并被处理。

有很多方法可以解决这个问题。

最简单的方法之一是从路径中删除约束并在控制器操作中执行参数验证检查。

另一种方法是在用于显示错误的编辑路线后立即添加其他路线:

    routes.MapRoute(
        "UserEditError",
        "user/edit/{id}",
        new {controller = "user", action = "EditError"}
        ); 

请注意,此路由上有 no 约束,并转到EditError操作。这样,您就可以为输入无效网址的用户提供更好的错误。

答案 2 :(得分:0)

我总是遇到的错误  make就是把

controller = "HomeController"代替controller = "Home"。每次都会打破你的路线: - )

  context.MapRoute(
     name: "RedirectAll",
     url: "{*url}",
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
     namespaces: new[] { typeof(HomeController).Namespace },
                  constraints: new { host = new HostConstraint("defenderrazor.com") });