簡體   English   中英

Url.Action()包含不需要的參數,試圖獲得更多控制權

[英]Url.Action() includes unwanted parameters, trying to have more control

我在頁面中有一個鏈接,如下所示:

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

與該頁面匹配的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 = "" })

但它對我不起作用,因為它將它們從我的網址中刪除但添加為參數:/ 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 = “四季”})這次沒有自動添加參數。

這個問題是我被迫使用命名路由。

改變你的路線

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

最后,我為每條路線構建自定義約束。

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

我發現它幾乎可以完全控制我們想要對我們的路線做什么。

嘗試在路由注冊期間將其他參數聲明為UrlParameter.Optional,並在操作中為這些參數設置默認值。 例如。

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

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM