MVC 2路由问题(bug?)

时间:2010-07-21 01:46:23

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

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

我插入了RouteDebugger库,它说“不匹配!”,但是,当我查看路线表时,那个在“匹配”列下出现的那个有一个绿色的“真”,所以我'我稍有损失。它如何匹配并且不能同时匹配?

我已经为评论该应用程序的所有其他路由,我仍然得到相同的结果。

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

Idk如果这有任何区别,它不应该......,但需要调用的动作是RedirectToRouteResult动作。

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

无论如何,如果有人可以指出路线失败的原因,我真的很感激!

提前致谢!

编辑2:为了进一步澄清,该应用程序主要用于发布短消息,然后对这些消息进行评论。

通过Ajax控制器发布消息可以正常工作,其路由Ajax/Post/Put匹配{controller}/Post/Put。您可能会注意到路线非常相似,但它们并不相互冲突。每个路由都有一个控制器约束,形式为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覆盖是按照它应该发送的,但是框架完全忽略了它(?)。

所以,继续,我决定重试完全相同的帖子尝试,但是这次启用路由调试器给了我以下内容:路由仍然不匹配,在路由表中YET,它以绿色列为匹配。逆势而上** **

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

猜猜是什么,我仍然得到相同的结果!就好像这个框架在我身上完全超越了MEGA HERP-A-DE-DERP ......

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

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

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

1 个答案:

答案 0 :(得分:0)

好的,所以我想出来了,我认为,不管现在哪种方式都有效。

我的第一个错误在于我在抑制来自数据库的错误。该操作已被调用,但崩溃并抑制了数据库错误,因此从我的角度来看,我假设该操作未被调用,因为我从未看到数据发生变化。

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

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

最后,我注意到如果为控制器A配置了一个路由,但该操作实际上在控制器B中,您将获得一个异常,使其看起来像处理“操作”但失败了。换句话说,当你真的没有时,它会误导你认为你正在采取行动。

无论如何,希望这有助于将来的某个人。