0

我在 MVC4 中的路线遇到问题。

我有一些动作存在于特定产品之外,还有更多存在于用户选择的产品中。为了适应我已经映射了两条路线的行动

        context.MapRoute(
            "CMS_product",
            "CMS/{productId}/{controller}/{action}/{id}",
            new { controller = MVC.CMS.Home.Name, action = MVC.CMS.Home.ActionNames.Index, productId = default(Guid).ToString(), id = UrlParameter.Optional },
            new string[] { "Areas.CMS.Controllers" }
        );

        context.MapRoute(
            "CMS_default",
            "CMS/{controller}/{action}/{id}",
            new { controller = MVC.CMS.Home.Name, action = MVC.CMS.Home.ActionNames.Index, id = UrlParameter.Optional },
            new string[] { "Areas.CMS.Controllers" }
        );

因此,虽然这适用于泛型,但我的所有路由都不会再匹配默认路由,而不是获取类似的 URL

~/CMS/产品/列表

在产品之外操作时,我会得到这样的网址。

~/CMS/00000000-0000-0000-0000-000000000000/产品/列表

另一个注意事项:我尝试将 Prodcut/List 硬编码为路由,并将其放在 CMS_product 之前,希望它会在其他 url 之前匹配。我觉得我必须忽略一些简单的事情。

4

2 回答 2

1

为了完整起见,如果其他人遇到类似问题,这里就是解决方案。

       // used to match ~/CMS/00000000-0000-0000-0000-000000000000/Product/List 
       // prevents the GUID.Empty from showing when there is no product value
       // in the segment
       context.MapRoute(
            name: "CMS_nullproduct",
            url: "CMS/{controller}/{action}/{id}",
            defaults: new { controller = MVC.CMS.Home.Name, action = MVC.CMS.Home.ActionNames.Index, id = UrlParameter.Optional },
            constraints: new { productId = Guid.Empty.ToString() },
            namespaces: new string[] { "Areas.CMS.Controllers" }
        ); 

        // matches any route with a productId segment value of anything aside from
        // GUID.Empty
        context.MapRoute(
            name: "CMS_product",
            url: "CMS/{productId}/{controller}/{action}/{id}",
            defaults: new { controller = MVC.CMS.Home.Name, action = MVC.CMS.Home.ActionNames.Index, id = UrlParameter.Optional },
            constraints: new { productId = @"^(\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\}{0,1})$" },
            namespaces: new string[] { "Areas.CMS.Controllers" }
        );

        context.MapRoute(
            name: "CMS_default",
            url: "CMS/{controller}/{action}/{id}",
            defaults: new { controller = MVC.CMS.Home.Name, action = MVC.CMS.Home.ActionNames.Index, id = UrlParameter.Optional },
            namespaces: new string[] { "Areas.CMS.Controllers" }
        );
于 2013-03-15T15:57:01.073 回答
0

在我看来,您应该删除productId.

context.MapRoute(
        "CMS_product",
        "CMS/{productId}/{controller}/{action}/{id}",
        new { controller = MVC.CMS.Home.Name, action = MVC.CMS.Home.ActionNames.Index, id = UrlParameter.Optional },
        new string[] { "Areas.CMS.Controllers" }
    );

如果您不提供 productId,您的路由引擎应该匹配第二个路由并生成 ~/CMS/Product/List 但如果您提供 productId 它匹配第一个规则。

另外,您可以编写自定义IRouteConstraint或使用正则表达式来限制 productId 值。

context.MapRoute(
        "CMS_product",
        "CMS/{productId}/{controller}/{action}/{id}",
        new { controller = MVC.CMS.Home.Name, action = MVC.CMS.Home.ActionNames.Index, id = UrlParameter.Optional },
        new { productId = @"^\d{8}\-\d{4}\-\d{4}\-\d{4}\-\d{12}$" }
        new string[] { "Areas.CMS.Controllers" }
    );
于 2013-03-04T21:09:38.887 回答