问题理解MVC中的路由

本文关键字:路由 MVC 问题 | 更新日期: 2023-09-27 18:11:00

在我阅读了所有文档之后,我认为我至少有一个理解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,我有几个方法,其中一个是"List"方法,它将产品列表呈现给"List"视图。

我以为我理解RedirectToAction是如何工作的,我添加了一个"Add"方法(见下文),它添加了一个新产品,并返回一个RedirectToAction,我理解这将是正确的方式来重定向到同一个"AdminController"上的List动作

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

然而,在返回"Add"时,它总是尝试路由到路径website.com/Account/Login/ReturnUrl=%2f

然而,如果我去website.com/Admin,它确实呈现了我所期望的列表。但是当在上面的例子中使用RedirectToAction时,它会尝试转到/Account/Login (Controller/action)。

这是我的理解,RedirectToAction("List", "Admin")将路由到AdminController控制器上的"List"方法,我按预期使用它。

有人能帮我理解这背后的原因吗?但是,也有人可以发表一些推荐的文章来理解整个MVC路由,包括web如何。

最后,这也是我的理解,框架的路由发现是按照它们在你的routes.MapRoute()声明中指定的顺序完成的,并在第一个匹配的位置停止。因此,如果第一个被列为Controller = "Admin", Action = "List",我希望按照惯例,这是它首先匹配并返回的正确路由。

问题理解MVC中的路由

你的路由需要不同(url参数),因为第一个匹配url的路由将被使用。

这将为您工作:

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

如果在uri中没有找到/指定参数,则使用默认值(方法中的第三个参数)。

关于你关于/Account/Login/ReturnUrl=%2f的问题。登录重定向由MembershipProvider处理,而不是由标准路由机制处理。