2017-01-25 1 views
3

Я написал свои маршруты следующим образом.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 

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

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

Update: Контроллер 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"); 

Это не работает.

+0

Показать код контроллера для перенаправления –

+0

Я вижу, что маршрут 'AdminECommerce' выполняется первым, а не' UserRegistration' по нисходящему порядку маршрута, если они находятся в областях, вы можете добавить параметр в области 'defaults' к различать их. –

+0

У меня нет областей в моем проекте, Просто разделяйте библиотеки классов для каждой части моего проекта. –

ответ

2

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 читает таблицу маршрутов от верхней части к нижней части, чтобы соответствовать Запрашиваемая страница с UriTemplate. Итак, в этом случае он выберет первый шаблон.

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

return RedirectToRoute("Registration", new 
{ 
    controller = "Registration", 
    action = "Register" 
}); 
+2

для первого параметра Я заменил «Регистрация» на «UserRegistration», и теперь он хорошо работает, Спасибо. –

+0

Рад помочь ... – Marusyk

+0

Я могу подтвердить, что это правда. У меня такая же проблема. Самый простой способ состоял в том, чтобы не иметь одинаковых имен для методов действий и имен классов. Но, в любом случае, я надеюсь, что это будет улучшено, если это возможно. :/Второй вариант заключается в использовании перенаправления на url вместо redirectToAction следующим образом: «Перенаправление (« http://www.google.com/ »)». – JedatKinports