【问题标题】:RedirectToAction redirects wrong with Other namespaces asp.net mvcRedirectToAction 重定向错误与其他命名空间 asp.net mvc
【发布时间】:2017-01-25 08:50:19
【问题描述】:

我的路线是这样写的。

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

它不起作用。

【问题讨论】:

  • 显示您的控制器代码以进行重定向
  • 我看到路由 AdminECommerce 优先执行,而不是 UserRegistration 按自上而下的路由顺序,如果它们在区域中,您可以将 area 参数添加到 defaults 以区分它们。
  • 我的项目中没有区域,只是为我的项目的每个部分单独的类库。
  • @AliVahidi 您使用的是哪个版本的 mvc?
  • 我正在使用 mvc 4

标签: c# asp.net-mvc routetable


【解决方案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"
});

【讨论】:

  • 对于第一个参数,我将“Registration”替换为“UserRegistration”,现在效果很好,谢谢。
  • 很高兴能帮上忙 :)
  • 我可以确认这是真的。我有同样的问题。最简单的方法是动作方法和类名称不要使用相同的名称。但无论如何,我希望如果可能的话,这会以某种方式得到改善。 :/ 第二个选项是使用重定向到 url 而不是像这样的 redirectToAction:Redirect("http://www.google.com/").
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
  • 2013-06-17
  • 2014-12-06
  • 2017-06-14
  • 1970-01-01
相关资源
最近更新 更多