【发布时间】:2011-10-09 22:58:26
【问题描述】:
在阅读了所有文档之后,我认为我至少有一个理解 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 的工作原理,我添加了一个“添加”方法(见下文),该方法添加了一个新产品并返回一个 RedirectToAction,我理解这将是重定向到相同的 List 操作的正确方法“管理员控制器”
[HttpPost]
public ActionResult Add(Product product) {
if (_prodRepo.Add(product)) {
return RedirectToAction("List", "Admin");
}
return View("Add", product);
}
但是,在“添加”返回时,它总是尝试路由到路径 website.com/Account/Login/ReturnUrl=%2f。
但是,如果我访问 website.com/Admin,它会按我的预期呈现列表。但是当使用上面示例中的 RedirectToAction 时,它会尝试转到/Account/Login(控制器/动作)。
据我了解,RedirectToAction("List", "Admin") 将路由到 AdminController 控制器上的“List”方法,并且我按预期使用它。
谁能帮我理解这背后的原因。而且,有人可以发布一些推荐的文章来了解整个 MVC 路由,包括 web.config 如何与路由一起工作。
最后,我的理解也是,框架的路由发现是按照您在 routes.MapRoute() 声明中指定的顺序完成的,并在第一个匹配的位置停止。因此,如果第一个被列为 Controller = "Admin", Action = "List",按照惯例,我希望这是它首先匹配并返回的正确路由。
【问题讨论】:
标签: c# asp.net-mvc asp.net-mvc-routing