Перенаправление на действие сохраняет параметр маршрутизации недействительным при новом действии - PullRequest
1 голос
/ 16 февраля 2011

Вот мои маршруты:

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

Проблема в том, что URL в браузере после перенаправления в Deleteне ~/Messages/, как я ожидал, но вместо этого (предполагая, что message было, скажем, 12) ~/Messages/12/Index.

Индекс даже не принимает параметр message.Я не понимаю, почему это происходит.Что мне нужно изменить?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2011

Заменить следующее правило

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

Работает.

при написании правил вы должны знать, что только последний параметр может быть необязательным, а обязательный параметр должен быть помещен перед. Замена этого не соответствует правилу (измененному), хотя и должно. У меня нет точной причины, но когда вы передали 1-й (сообщения [неявно) и 3-й параметр [действие], он также попытался сопоставить {сообщение}, что не логично. таким образом, правило - помещать обязательные параметры в начале, как обсуждалось в этом вопросе о переполнении стека тоже.

0 голосов
/ 16 февраля 2011

Я думаю, вам нужно изменить порядок маршрутов «Действия для сообщений» и «Действия для общих сообщений»

...