RedirectToAction перенаправляет неправильно с другими пространствами имен asp.net mvc

Я написал свои маршруты так.

routes.MapRoute(
    name: "AdminECommerce",
    url: "Admin/ECommerce/{controller}/{action}/{id}",
    defaults: new { id = UrlParameter.Optional },
    namespaces: new []{ "AdminEcommerce.Controllers" }
);

routes.MapRoute(
    name: "ECommerce",
    url: "ECommerce/{controller}/{action}/{id}",
    defaults: new { id = UrlParameter.Optional },
    namespaces: new []{ "Ecommerce.Controllers" }
);

routes.MapRoute(
    name: "User",
    url: "Plugin/User/{controller}/{action}/{id}",
    defaults: new { id = UrlParameter.Optional },
    namespaces: new []{ "User.Controllers" }
);

routes.MapRoute(
    name: "UserRegistration",
    url: "Plugin/UserRegistration/{controller}/{action}/{id}",
    defaults: new { id = UrlParameter.Optional },
    namespaces: new []{ "UserRegistration.Controllers" }
);

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

Когда я хочу использовать RedirectToAction от одного действия к другому действию в том же контроллере он перенаправляет куда-то еще.

Например, я хочу, чтобы он перенаправил меня на

Plugin/UserRegistration/Register/Register

Но это отправляет меня

Admin/ECommerce/Register/Register

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

Что не так с моим кодом?

Обновление: контроллер Registration

public ActionResult Register()
    {
        ViewBag.securityQuestions = _dataRepository.GetContext().User_SecurityQuestion;
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult RegisterNewUser(User_User model, FormCollection collection)
    {

        try
        {
            // register new user 
              ...
            return RedirectToAction("Register");
        }
        catch
        {
            // making error messages 
              ...
            return RedirectToAction("Register");
        }

Я тоже попробовал это,

return RedirectToAction("Register","Registration");

Не работает

1 ответ

Решение

ASP.NET MVC распознает эти два маршрута, как один и тот же UriTemplate

routes.MapRoute(
    name: "AdminECommerce",
    url: "Admin/ECommerce/{controller}/{action}/{id}",
    defaults: new { id = UrlParameter.Optional },
    namespaces: new []{ "AdminEcommerce.Controllers" }
);

routes.MapRoute(
    name: "UserRegistration",
    url: "Plugin/UserRegistration/{controller}/{action}/{id}",
    defaults: new { id = UrlParameter.Optional },
    namespaces: new []{ "UserRegistration.Controllers" }
);

MVC читает таблицу маршрутов сверху вниз, чтобы сопоставить запрошенный URL-адрес с UriTemplate. Итак, в этом случае он выберет первый шаблон.

Попробуйте вместо этого использовать RedirectToRoute.

return RedirectToRoute("Registration", new 
{ 
    controller = "Registration", 
    action = "Register"
});
Другие вопросы по тегам