7

我在页面中有一个链接,如下所示:

Url.Action("List", "Item", new { category = "seasons" })

与该页面匹配的 Route 也有 parentGroup 和 group 参数

例如:/Seasons/Moober/Blue/1 -> /{category}/{parentGroup}/{group}/{id}

问题是当我在该页面上并使用 Url.Action 时,即使我尝试生成仅指向类别 /{category} 的链接,它也会添加所有缺少的路由值,它仍然会添加 parentGroup 和组。

我找到了这篇文章,建议这样做:

Url.Action("List", "Item", new { category = "seasons", group = "", parentGroup = "" })

但它对我不起作用,因为它将它们从我的网址中删除,但将它们添加为参数:/Seasons?parentGroup=Moober&group=Blue

我正在使用 MVC3。有没有办法强制 Url.Action() 仅使用提供的参数或取消我不想要的参数?

这里是路线。

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
    "ItemFromCategoryParentGroupSubGroup", // Route name
    "{category}/{parentGroup}/{group}/{id}/{language}", // URL with parameters
    new { controller = "Item", action = "Show", page = 1, language = ConfigurationManager.AppSettings["DefaultLanguage"] }, // Parameter defaults
    new
    {
        category = _validCategory,
        parentGroup = _validGroup,
        group = _validChildGroup,
        id = _validItemInChildGroup
    }
);

routes.MapRoute(
    "ItemListFromParentGroup", // Route name
    "{category}/{parentGroup}/{group}/{language}", // URL with parameters
    new { controller = "Item", action = "List", page = 1, language = ConfigurationManager.AppSettings["DefaultLanguage"] }, // Parameter defaults
    new
    {
        category = _validCategory,
        parentGroup = _validGroup,
        group = _validChildGroup
    }
);

routes.MapRoute(
    "ItemWithGroup", // Route name
    "{category}/{group}/{id}/{language}", // URL with parameters
    new { controller = "Item", action = "Show", page = 1, language = ConfigurationManager.AppSettings["DefaultLanguage"] }, // Parameter defaults
    new
    {
        category = _validCategory,
        group = _validGroup,
        id = _validItemInGroup
    }
);

routes.MapRoute(
    "ItemListWithGroup", // Route name
    "{category}/{group}/{language}", // URL with parameters
    new { controller = "Item", action = "List", page = 1, language = ConfigurationManager.AppSettings["DefaultLanguage"] }, // Parameter defaults
    new
    {
        category = _validCategory,
        group = _validGroup
    }
);

routes.MapRoute(
    "ItemListFromCategory", // Route name
    "{category}/{language}", // URL with parameters
    new { controller = "Item", action = "List", page = 1, language = ConfigurationManager.AppSettings["DefaultLanguage"] }, // Parameter defaults
    new
    {
        category = _validCategory
    }
);

编辑:

我目前有一个解决方法,看起来像这样: Url.RouteUrl("ItemListFromCategory") 我基本上强制使用 Url.Action("List", "Item", new { category = "seasons" }) 这一次没有自动添加参数。

问题是我被迫使用命名路由。

4

3 回答 3

3

改变你的路线

routes.MapRoute(
    "SomeRoute", // Route name
    "/{category}/{parentGroup}/{group}/{id}", 
    new { 
        controller = "DefaultController", 
        action = "DefaultAction", 
        parentGroup = UrlParameter.Optional
        group = UrlParameter.Optional
        id= UrlParameter.Optional
    }
);

制作 parentGroup , parentGroup , group optional

于 2011-08-08T08:37:18.780 回答
0

尝试在路由注册期间将其他参数声明为 UrlParameter.Optional 并在您的操作中为这些参数设置默认值。例如。

MyAction(string category, string group = "", parentGroup = 0)

希望这可以帮助。

于 2011-08-08T06:32:20.620 回答
0

最后,我为每条路线建立了自定义约束。

http://msdn.microsoft.com/en-us/library/system.web.routing.route.constraints.aspx

我发现它几乎可以完全控制我们希望对路线进行的任何操作。

于 2012-05-23T18:40:33.327 回答