【问题标题】:MVC 2 Routes issue (bug?)MVC 2 路由问题(错误?)
【发布时间】:2011-03-18 18:25:48
【问题描述】:

所以,我的应用程序中的路由遇到了一个奇怪的问题。由于某种原因,它只是不匹配。它看起来像{controller}/Comments/Put,并且它具有相应的约束以确保它进入正确的控制器,在本例中为“Misc”。当我发布到路线时,它只是不匹配......

我插入了 RouteDebugger 库,它说“不匹配!”,但是,当我查看路由表时,正在出错的路由在“匹配”列下有一个绿色的“真”,所以我米略有损失。怎么能同时匹配又不匹配呢?

我已经注释掉了应用程序的所有其他路由,但我仍然得到相同的结果。

它确实起作用的一次是当我将路线更改为愚蠢的长时,但随后我收到另一个错误,说我无法发布到该操作,这是因为它装饰有[HttpPut],但是,我将 HttpMethodOverride 作为帖子的一部分...无论如何,这是另一个愚蠢的错误,甚至不应该发生,但话又说回来,这可以说是所有错误。

如果这有什么不同,它不应该...,但需要调用的操作是 RedirectToRouteResult 操作。

编辑:我也尝试将路线放在列表的最顶部,以便首先调用它,但仍然没有变化......

无论如何,如果有人能指出路线失败的原因,我将不胜感激!

提前致谢!

编辑 2:为了澄清一点,该应用程序本质上是用于发布短消息,然后对这些消息进行评论。

通过路由Ajax/Post/Put 匹配{controller}/Post/Put 的Ajax 控制器可以正常发布消息。您可能会注意到这些路线非常相似,但它们并不相互冲突。每条路由都有一个controller = new ControllerConstraint("Ajax")controller = new ControllerConstraint("Misc")形式的控制器约束。

编辑 3: 再次澄清一点,这里是应该调用的控制器/动作和 Global.asax 中的路由:

MiscController : BaseController {
    [HttpPut, ValidateAntiForgeryToken]
    public RedirectToRouteResult PutComment(
        [Bind(Prefix = "Comment", Include = "Text")] Comment Comment) {
        // Do stuff...
    }
}

Routes.MapRoute("Misc (Put Comment)", "{controller}/Comments/Put", new {
    action = "PutComment"
}, new {
    controller = new ControllerConstraint("Misc")
});

编辑 4:硬写如下路线没有效果:

Routes.MapRoute("Misc (Put Comment)", "Misc/Comments/Put", new {
    controller = "Misc",
    action = "PutComment"
});

编辑 5: 我已经完成并简化了所有路线,网址中没有更多参数,也没有更多限制。所以,路线看起来像:

Routes.MapRoute("Misc (Comments)", "Misc/Comments", new {
    controller = "Misc",
    action = "Comments"
});

所以,既然路线是完全硬编码的,那么在没有匹配路线的情况下应该不会有任何差异。简单明了……或者是……

在尝试之后,它有点工作,我现在对不允许 POST 大喊大叫,这是真的,因为操作被 PUT 装饰,但是,Http 覆盖正在按应有的方式发送,但是框架完全忽略了它(?)。

所以,继续前进,我决定重试完全相同的发布尝试,但这次启用路由调试器给了我以下信息:路由仍然不匹配,但在路由表中,它以绿色列为匹配。矛盾的**!!!

因此,吞下另一个 BS 错误,我决定禁用所有其他路由以及所有其他控制器的所有其他方法。

猜猜看,我仍然得到相同的结果!就好像这个框架对我来说完全是 SUPER MEGA HERP-A-DE-DERP...

我非常沮丧。我编写的应用程序比这个简单的帖子/评论应用程序复杂得多,而且我从未遇到过这么多困难......

我只是不知道了......

::走到角落,蜷缩起来开始哭泣::

【问题讨论】:

  • 如果您能提供更详细的关于如何添加路线的信息,我们可以提供帮助。你是说你打电话给Misc/Comments/Put 还是你把{controller}/Comments/Put 放在路由映射字典中?如果是这样,请告诉我们您如何在路由表中删除它。
  • 我正在通过一个表单帖子致电/Misc/Comments/Put,该表单帖子应与/{controller}/Comments/PutControllerConstraint("Misc") 匹配。它没有。另一条类似的路线,/Ajax/Posts/Put 工作正常,它也有一个ControllerConstraint("Ajax"),所以它们不可能冲突。希望对您有所帮助。

标签: c# asp.net-mvc-2 routes


【解决方案1】:

好的,所以我想通了,但无论哪种方式现在都有效。

我的第一个错误是我抑制了来自数据库的错误。该操作已被调用,但正在崩溃并抑制数据库错误,因此从我的角度来看,我假设该操作没有被调用,因为我从未看到数据更改。

我的第二个错误是我没有正确重定向,或者特别是我没有为重定向指定控制器。反过来,重定向试图重定向到同一控制器中不存在的操作。

但是我做到了,这有点矛盾,得到了几次 HttpVerb 异常。我只能假设我正在调用原始操作,然后重定向到现有操作,但重定向保留了 HttpVerb 从而导致第二个操作出现异常。然而,这似乎仍然是一个可能是错误的 BS 解释,但这是我能理解它的最佳方式。

最后,我注意到如果为控制器 A 配置了路由,但操作实际上在控制器 B 中,您将收到一个异常,使其看起来像是在处理“操作”但失败了。换句话说,它会误导您认为您正在执行某项操作,而实际上并非如此。

无论如何,希望这对将来的人有所帮助。

【讨论】:

    猜你喜欢
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    相关资源
    最近更新 更多