【问题标题】:Redirecting to action preserves routing parameter invalid on new action重定向到操作保留路由参数对新操作无效
【发布时间】:2011-06-28 15:02:29
【问题描述】:

这是我的路线:

_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

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

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2 .net-3.5 routing


    【解决方案1】:

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

    【讨论】:

    • 这无济于事,因为它会导致 ViewMessage 路由的 URL 变为 /Messages/ViewMessage?message=12 而不是所需的 /Messages/12
    【解决方案2】:

    替换以下规则

    _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+"}
        );
    

    有效。

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

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 2014-10-27
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      相关资源
      最近更新 更多