Asp.net mvc 重定向到操作会保留路由参数在新操作上无效

Asp.net mvc 重定向到操作会保留路由参数在新操作上无效,asp.net-mvc,asp.net-mvc-2,.net-3.5,routing,Asp.net Mvc,Asp.net Mvc 2,.net 3.5,Routing,以下是我的路线: _routes = RouteTable.Routes; _routes.Clear(); _routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); _routes.IgnoreRoute("{*favicon}", new {favicon = @"(.*/)?favicon.ico(/.*)?"}); _routes.MapRoute( "Message-specific Actions", "Message

以下是我的路线:

_routes = RouteTable.Routes;

_routes.Clear();

_routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
_routes.IgnoreRoute("{*favicon}", new {favicon = @"(.*/)?favicon.ico(/.*)?"});

_routes.MapRoute(
    "Message-specific Actions",
    "Messages/{message}/{action}",
    new {controller = "Messages", action = "ViewMessage"},
    new {message = @"\d+"}
    );

_routes.MapRoute(
    "General Message Actions",
    "Messages/{action}",
    new {controller = "Messages", action = "Index"},
    new {action = @"\D+"}
    );

_routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new {controller = "Home", action = "Index", id = ""} // Parameter defaults
    );

_routes.MapRoute(
    "Catch All",
    "{*path}",
    new {controller = "Error", action = "Error"}
    );
以下是我的控制器的相关部分:

public class MessagesController
{
    public ActionResult Index()
    {
        return View();
    }

    // GET: ~/Messages/1
    public ActionResult ViewMessage(int message)
    {
        return View(// stuff to get message from repo);
    }

    [HttpPost]
    // POST : ~/Messages/1/Delete
    public ActionResult Delete(int message)
    {
        // do stuff
        return RedirectToAction("Index");
    }
}
问题是,在Delete中重定向之后,浏览器中的URL并不像我预期的那样是~/Messages/的,而是假设message是,比如说,12~/Messages/12/Index


索引甚至不接受消息参数。我不明白为什么会这样。我需要更改什么?

我认为您需要切换“消息特定操作”路由和“一般消息操作”的顺序,以替换以下规则

_routes.MapRoute(
    "Message-specific Actions",
    "Messages/{message}/{action}",
    new {controller = "Messages", action = "ViewMessage"},
    new {message = @"\d+"}
    );

它起作用了


在编写规则时,您应该知道,只有最后一个参数可以是可选的,而强制参数应该放在前面。替换此规则与修改后的规则不匹配,尽管它应该匹配。我没有确切的原因,但当您隐式传递1stMessages[和第三个参数[action]时,它试图匹配{message}这也是不合逻辑的。因此,规则是将强制参数放在开头,如本文所述。

这没有帮助,因为它会导致ViewMessage路由的URL变为/Messages/ViewMessage?message=12,而不是所需的/Messages/12。
_routes.MapRoute(
    "Message-specific Actions",
    "Messages/{action}/{message}",
    new {controller = "Messages", action = "ViewMessage"},
    new {message = @"\d+"}
    );