5

当您在操作中操作数据时,您通常会收到一个 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时,一切正常,但是当我发布,当它应该转到 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

4

3 回答 3

1

我强烈建议安装此处找到的路由调试器。它将准确地向您展示每个路由是如何解析给定 URL 的,因此您可以看到当您点击该 URL 时实际发生了什么。如果您的路线被跳过,那么您知道您的约束正在发挥作用,您可以专注于任何捕捉它的东西。如果您的路线被击中,那么这是动作和/或它所采取的动词的问题。

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

于 2012-04-29T01:29:15.793 回答
1

你说:

不允许用于访问路径“/object/edit/-2”的 HTTP 动词 POST。

但是,异常状态:

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

编辑:

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

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

于 2012-04-20T13:29:10.523 回答
0

尝试删除

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

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

于 2012-04-28T00:47:46.187 回答