【问题标题】:Problems understand Routing in MVC问题理解 MVC 中的路由
【发布时间】: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


    【解决方案1】:

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

    因此这对你有用:

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

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

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

    【讨论】:

    • 谢谢。我会将此标记为答案。但是,我仍然不明白为什么调用 RedirectToAction("List", "Admin") 不能正确解析到第一个列出的路由(我已经指定)。另外,我知道你提到了 MembershipProvider,但它是怎么混进来的呢?
    • /Account/Login/ReturnUrl=%2f 是用户未通过身份验证时表单身份验证使用的 URL。当您将路线更改为我建议的路线时,RedirecToAction 应该可以工作。不是吗?
    • 是的。当我将其更改为您的建议时,它确实有效。但是我仍然不明白为什么当我调用指定的 RedirectToAction("List", "Admin") 时没有选择 Controller = Admin, Action = List 的第一条路由 {controller}/{action}/{id}完全相同的控制器和动作。
    • 未选中是什么意思?
    • selected = 在路由集合中的那个路由被“选择”为要使用的路由。 {controller}/{action}/{id} 基本上是 MVC 默认值的副本,它被放置为“Catch all”,我只更改了控制器和动作默认值。因此,如果我调用 RedirectToAction("List", "Admin") 我明确声明“发送到 AdminController 上的 List 操作”,因此当它按照指定的顺序通过定义的路由时,它应该来到我的第一条路线并说“我有一个匹配”并指向“AdminController”上的“List”方法。对吗?
    猜你喜欢
    • 1970-01-01
    • 2016-11-09
    • 2011-07-31
    • 1970-01-01
    相关资源
    最近更新 更多