action()包含不需要的参数,试图拥有更多的控制

本文关键字:拥有 控制 参数 包含 不需要 action | 更新日期: 2023-09-27 18:04:51

我在一个页面中有一个这样的链接:

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

匹配该页的Route也有一个parentGroup和group参数

:交货/季/例/蓝色/1 ->{类别}/{parentGroup}/{集团}/{id}

问题是当我在那个页面上并使用Url。它会添加所有缺失的路由值,即使当我试图生成一个只指向/{category}的类别链接时,它仍然会添加parentGroup和group。

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

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

但它不为我工作,因为它从我的url中删除它们,但将它们作为参数添加:蓝色/季节? parentGroup = Moober&组=

我正在使用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"})而且这次没有自动添加任何参数。

这样做的问题是我被迫使用命名路由

action()包含不需要的参数,试图拥有更多的控制

更改路由

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

尝试将其他参数声明为UrlParameter。在路由注册时可选,并在操作中为这些参数设置默认值。如。

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

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

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

我发现它几乎可以完全控制我们想对路由做的任何事情。