当您操作操作中的数据时,您经常会收到一个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是“找不到方法”答案 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等)。