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

时间:2011-02-16 19:47:53

标签: 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",
    "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中重定向后的浏览器中的网址不是我期望的~/Messages/,而是它(假设message是12){{ 1}}。

索引甚至不接受~/Messages/12/Index参数。我不明白为什么会这样。我需要改变什么?

2 个答案:

答案 0 :(得分:0)

我认为您需要切换“特定于消息的操作”路由和“常规消息操作”的顺序

答案 1 :(得分:0)

替换以下规则

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

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

有效。

在编写规则时,您应该知道只有最后一个参数可以是可选的,并且必须放置强制参数。替换它与规则(修改后的规则)不匹配,尽管它应该。我没有确切的理由,但是当你通过第一个(消息[隐式]和第三个参数[动作]时,它也试图匹配{消息},这是不合逻辑的。所以规则是在开始时强制性的参数,如stackoverflow question中所讨论的那样。