Url.Action()包含不需要的参数,试图获得更多控制权

Ema*_*uel 7 .net c# routing url.action asp.net-mvc-3

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

Url.Action("List", "Item", new { category = "seasons" })
Run Code Online (Sandbox Code Playgroud)

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

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

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

我发现这篇文章,建议这样做:

Url.Action("List", "Item", new { category = "seasons", group = "", parentGroup = "" })
Run Code Online (Sandbox Code Playgroud)

但它对我不起作用,因为它将它们从我的网址中删除但是将它们添加为参数:/ 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
    }
);
Run Code Online (Sandbox Code Playgroud)

编辑:

我现在有一个解决方法,如下所示:Url.RouteUrl("ItemListFromCategory")我基本上强制应该与Url.Action匹配的相同路由("List","Item",new {category = "四季"})这次没有自动添加参数.

这个问题是我被迫使用命名路由.

Ema*_*uel 0

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

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

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