我以为在读完所有文档之后,我至少有一个理解MVC路由的基础,只有在试图利用它时才会失败。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,我有几个方法,一个是呈现的产品列表,以“清单”方法“列表显示。
我以为我明白了RedirectToAction是如何工作的,并且我添加了一个添加新产品的“添加”方法(参见下文),并返回一个RedirectToAction,我知道这将是重定向到List操作的正确方法“AdminController”
[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(“列表”,“管理员”)将路由到AdminController控制器上的“List”方法,并且我按照预期使用它。
有人可以帮我理解背后的原因。但是,也有人可以发布一些推荐的文章来理解整个MVC路由,包括web.config如何与路由协同工作。
最后,我的理解是,框架的路由发现按照它们在您的routes.MapRoute()声明中指定的顺序完成,并在第一个匹配的地方停止。因此,如果第一个被列为Controller =“Admin”,Action =“List”,我希望按照惯例这是它首先匹配和返回的正确路线。
Thx。我会将其标记为答案。然而,我仍然不明白为什么调用RedirectToAction(“列表”,“管理员”)没有正确解析到第一个列出的路由(我指定)。另外,我知道你提到了MembershipProvider,但是如何进入混合? – pghtech
'/ Account/Login/ReturnUrl =%2f'是表单身份验证在用户未通过身份验证时使用的网址。当您将路线改为我建议的路线时,“RedirecToAction”应该可以工作。不是吗? – jgauffin
是的。当我将其改变为您的建议时,它确实有效。但我仍然不明白为什么当我调用RedirectToAction(“List”,“Admin”)时没有选择Controller = Admin,Action = List的第一条路线{controller}/{action}/{id}控制器和操作完全相同。 – pghtech