【问题标题】:C# MVC Custom Routing DesignC# MVC 自定义路由设计
【发布时间】:2013-07-15 06:45:04
【问题描述】:

默认路由是:

routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{category}",
            defaults: new { controller = "Home", action = "Index", category = UrlParameter.Optional }
        );

正在生成的 URL 如下所示:www.domain.com/Home/Index/Category

但如果用户正在浏览特定类别,我希望 URL 看起来像这样:www.domain.com/Home/Category

如果没有选择类别:www.domain.com/Home

我添加了这段代码:

routes.MapRoute(null, "{controller}/{category}", new { action = "Index" });
routes.MapRoute(null, "{controller}/{action}", new { controller = "Home", action = "Index", category = (string)null });

并且 URL 开始看起来像我想要的那样,但是!在控制器中调用动作的表单方法不再起作用:

@using (Html.BeginForm("AddToCart", "Home"))
                            {                
                                @Html.Hidden("category", Model.CurrentCategory)
                                @Html.Hidden("productId", p.ProductId)
                                <input type="submit" value="Add To Cart" />
                            }

由于某种原因,表单操作方法似乎调用了错误的路由 那就是:

routes.MapRoute(null, "{controller}/{category}", new { action = "Index" });

而不是

routes.MapRoute(null, "{controller}/{action}", new { controller = "Home", action = "Index", category = (string)null });

因为当点击提交按钮时,浏览器重定向到 url: www.domain.com/Home/AddToCart 并且“Home”控制器中的操作方法“AddToCart”永远不会被调用。

【问题讨论】:

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


    【解决方案1】:

    它不起作用,因为 MVC 框架将使用第一个匹配的路由。即:

         routes.MapRoute(null, "{controller}/{category}", new { action = "Index" });
    

    路由机制无法区分

         routes.MapRoute(null, "{controller}/{category}", new { action = "Index" });
    

         routes.MapRoute(null, "{controller}/{action}", new { controller = "Home", action = "Index", category = (string)null });
    

    您需要像 {controller}/Categories/{category} 这样的路由才能正确匹配。 (如果“类别”不打扰您)

    另一种方法是使用正则表达式作为约束来匹配类别名称,如果匹配失败,路由将落入您的第二个配置,因此您的表单将继续工作。

    看看http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-route-constraint-cs

    【讨论】:

    • {controller}/Categories/{category} 代码为 routes.MapRoute(null, "{controller}/Range/{category}", new { action = "Index" }); routes.MapRoute("ShowAll", "{controller}/{action}", new { controller = "Home", action = "Index" });适用于大多数操作,除非我在 www.domain.com/Home/Range/200-600 并且 Html.ActionLink("Show All", "Index", "Home") 路由系统重定向到 www .domain.com/Home/Range/200-600 而不是 www.domain.com/Home/ 但 Html.ActionLink("Show All", "Index", "OtherController") 工作正常
    • 我不知道为什么不适合你。也许您发布更多代码,以便我可以更好地理解。或者,也许您可​​以通过查看此链接msdn.microsoft.com/en-us/library/cc668201(v=vs.100).aspx#routes 自己弄清楚为什么不起作用
    • 您能否提供处理此链接的操作的代码 Html.ActionLink("Show All", "Index", "Home")?也许您在代码中明确重定向?
    • public ViewResult Index(string category) { ProductsListViewModel viewModel = new ProductsListViewModel { Products = products .Where(x => category == null || x.Category == category) .OrderBy(x => x.ProductId), CurrentCategory = 类别, Cart = GetCart() };返回视图(视图模型); }
    • 动作方法中的代码似乎是正确的。它必须与您的路线配置相关。检查其顺序是否正确(最具体的路线排在第一位)。
    猜你喜欢
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 2011-04-02
    • 2020-04-15
    相关资源
    最近更新 更多