Проблемы разбираются в маршрутизации в MVC - PullRequest
0 голосов
/ 10 октября 2011

Я думал, что у меня есть хотя бы основания для понимания маршрутизации в MVC после всей прочитанной мной документации, но только для того, чтобы потерпеть неудачу при попытке ее использовать.

У меня есть следующие два маршрута, объявленные в моемGlobal.aspx

routes.MapRoute(
    "", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Admin", action = "List", id = UrlParameter.Optional } // Parameter defaults
);

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

У меня есть AdminController, у меня есть несколько методов, один из которых - метод «Список», который выводит список продуктов в представление «Список».

Iмне показалось, что я понял, как работает RedirectToAction, и я добавил метод «Add» (см. ниже), который добавляет новый продукт и возвращает RedirectToAction, который, как я понял, будет правильным способом перенаправления на действие List в том же «AdminController»

[HttpPost]
public ActionResult Add(Product product) {
    if (_prodRepo.Add(product)) {
        return RedirectToAction("List", "Admin");
    }
    return View("Add", product);
}

Однако при возврате «Добавить» он всегда пытается перенаправить на путь website.com/Account/Login/ReturnUrl=%2f.

Однако, если я захожу на website.com/Admin, он отображает список, как я и ожидал.Но при использовании RedirectToAction, как в примере выше, он пытается перейти к /Account/Login (Controller / action).

Насколько я понял, RedirectToAction ("List", "Admin") будет маршрутизироватьк методу «List» на контроллере AdminController и к тому, что я использовал его, как и ожидалось.

Может кто-нибудь, пожалуйста, помогите мне понять причину этого.Но также, кто-то может опубликовать некоторые рекомендуемые статьи для понимания всей маршрутизации MVC, включая то, как web.config работает с маршрутизацией.

Наконец, я также понял, что обнаружение маршрута с помощью инфраструктуры выполняется в том порядке, в котором ониуказаны в вашем маршруте .MapRoute () объявление и останавливается на первом, который соответствует.Поэтому, если первый из них указан как Controller = "Admin", Action = "List", я бы по соглашению ожидал, что это правильный маршрут, по которому он будет сначала совпадать и возвращаться.

1 Ответ

1 голос
/ 10 октября 2011

Ваши маршруты должны отличаться (параметр url), поскольку будет использоваться первый маршрут с соответствующим URL.

Таким образом, это будет работать для вас:

routes.MapRoute("Admin", 
    "admin/{action}/{id}", 
    new { controller = "Admin", action = "List", id = UrlParameter.Optional });

Значения по умолчанию (третий параметр в методе) используются, если параметры не найдены / не указаны в URI.

Что касается вашего вопроса относительно /Account/Login/ReturnUrl=%2f. Перенаправление входа в систему обрабатывается MembershipProvider, а не стандартным механизмом маршрутизации.

...