问题理解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",我希望按照惯例,这是它首先匹配并返回的正确路由。
你的路由需要不同(url参数),因为第一个匹配url的路由将被使用。
这将为您工作:
routes.MapRoute("Admin",
"admin/{action}/{id}",
new { controller = "Admin", action = "List", id = UrlParameter.Optional });
如果在uri中没有找到/指定参数,则使用默认值(方法中的第三个参数)。
关于你关于/Account/Login/ReturnUrl=%2f
的问题。登录重定向由MembershipProvider
处理,而不是由标准路由机制处理。