POST上的路由约束错误

时间:2012-04-20 13:25:58

标签: c# asp.net-mvc asp.net-mvc-routing route-constraint

当您操作操作中的数据时,您经常会收到一个ID作为参数,但您需要对该ID进行一些错误处理。您必须为每个操作执行的错误处理之一是确保ID高于0(不是负数)。因此,我没有在动作中处理这个问题,而是想添加一个路由约束,这样如果它是一个负id,就不会路由到该动作。

这是我的代码:

//route definition
        routes.MapRoute(
            "default route" ,
            "{controller}/{action}/{id}" ,
            new { id = UrlParameter.Optional },
            new { id = @"^\d+$" }
        );

//action definition (note I also tried with only [HttpPost] and with nothing same result
        [AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get )]
        public ActionResult Edit( int id )

当您对操作执行 GET 时一切正常,但是当我 POST 时,我会收到以下错误,当它应该转到404页面

 HTTP verb POST used to access path '/object/edit/-2' is not allowed.

[HttpException (0x80004005): The HTTP verb POST used to access path '/object/edit/-2' is not allowed.]
   System.Web.DefaultHttpHandler.BeginProcessRequest(HttpContext context, AsyncCallback callback, Object state) +740
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +632
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +194

有什么想法吗?也许是更好的解决方案?

编辑:刚刚注意到一些有趣的东西,我最初认为错误信息是500,但它的405是“找不到方法”

3 个答案:

答案 0 :(得分:1)

你说:

  

不允许用于访问路径'/ object / edit / -2'的HTTP谓词POST。

然而,例外情况表明:

  

不允许使用用于访问路径'/ profile / editlink / -2'的HTTP谓词POST。

编辑:

我认为这可能与您的问题有关。

然而,并不像你说的那样。

答案 1 :(得分:1)

我强烈建议您安装here找到的路由调试程序。它会准确地向您显示每条路由如何解析给定的URL,因此您可以看到当您点击该URL时实际发生的情况。如果您的路线被跳过,那么您就知道您的约束正在起作用,您可以专注于捕获它的任何东西。如果您的路线被击中,那么动作和/或动词就会出现问题。

旁注:我完全没能让这个调试器的2.0.0.7版本正常工作(早在八月),但直接链接到文章(或NuGet上的1.0.0.1版本)的工作正常。我认为NuGet中的当前版本正在运行,但如果没有,请尝试旧版本。

答案 2 :(得分:0)

尝试删除

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get )]

看看它是否有效(通常你会把[HttpPost]拒绝HttpGet等)。