【问题标题】:Route Constraint Error on POSTPOST 上的路由约束错误
【发布时间】:2012-04-20 13:25:57
【问题描述】:

当您在操作中操作数据时,您通常会收到一个 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

【问题讨论】:

  • 你在做 URL 重写吗?您的异常中的路径不匹配。
  • 不抱歉,我在第一个答案中提到过,我打算替换两者中的动作和控制器,但错过了第二次出现。它们都匹配。
  • 我真的不明白为什么在 GET 上会很好,在 POST 上会抛出错误

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


【解决方案1】:

你说:

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

但是异常状态:

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

编辑:

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

但不是你说的。

【讨论】:

  • 是的,抱歉,我复制了错误,但我打算替换两者,但错过了第二次,我的错。
  • 你能edit 把它变成一个答案而不是一个问题吗?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    尝试删除

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

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

    【讨论】:

    • 你是对的,虽然我只是出于测试目的添加了此语句。
    猜你喜欢
    • 2013-11-24
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多