问题了解MVC中的路由

时间:2011-10-09 22:58:26

标签: c# asp.net-mvc asp.net-mvc-routing

在我阅读完所有文档后,我认为至少有一个基础可以理解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是如何工作的,我添加了一个“添加”方法(见下文),它添加了一个新的Product并返回一个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(“List”,“Admin”)将路由到AdminController控制器上的“List”方法,并且我按预期使用它。

有人可以帮助我理解这背后的原因。但是,有人可以发布一些推荐的文章来理解整个MVC路由,包括web.config如何与路由一起工作。

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

1 个答案:

答案 0 :(得分:1)

您的路线需要不同(url参数),因为将使用带有匹配网址的第一条路线。

这对您有用:

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

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

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