2011-10-09 91 views
0

我以为在读完所有文档之后,我至少有一个理解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”,我希望按照惯例这是它首先匹配和返回的正确路线。

回答

1

您的路由需要不同(url参数),因为将使用具有匹配url的第一条路由。因此

这能够为您服务:

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

的缺省值(在该方法中的第三个参数)用于如果未找到/ URI中指定的参数。

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

+0

Thx。我会将其标记为答案。然而,我仍然不明白为什么调用RedirectToAction(“列表”,“管理员”)没有正确解析到第一个列出的路由(我指定)。另外,我知道你提到了MembershipProvider,但是如何进入混合? – pghtech

+0

'/ Account/Login/ReturnUrl =%2f'是表单身份验证在用户未通过身份验证时使用的网址。当您将路线改为我建议的路线时,“RedirecToAction”应该可以工作。不是吗? – jgauffin

+0

是的。当我将其改变为您的建议时,它确实有效。但我仍然不明白为什么当我调用RedirectToAction(“List”,“Admin”)时没有选择Controller = Admin,Action = List的第一条路线{controller}/{action}/{id}控制器和操作完全相同。 – pghtech