路由和反射问题

时间:2011-09-22 11:36:21

标签: asp.net-mvc asp.net-mvc-routing

我添加了路由到我的解决方案,以便在地址栏中拥有更友好的用户界面。

我启动解决方案,当我翻转我的收藏夹链接时,我看到网址 ... / Affaire / Favorite (下图)。这个对我来说没问题。

enter image description here

当我翻转我的回收站链接时,我看到网址 ../ Affaire / Deleted (下图)。这个对我来说没问题。

enter image description here

然后我点击回收站链接,我导航到相应的页面,地址栏中显示的URL对我来说没问题(下图)。

enter image description here

接下来,我再次滚动收藏夹链接(下图),我看到URL ../ Affaire / Delete?OnlyFavorite = true !!那不行。

enter image description here

路由现在检索的属性不是来自我的链接,而是来自活动URL!此属性名为OnlyFavorite,我不想要此属性。这就是“反思”。请注意,我的所有路由都使用相同的控制器和相同的操作,但使用不同的路由属性。

以下是我使用的一些链接。

导航到收藏页面的示例:

@Html.ActionLink("Favorites", "SearchAffaires", new { OnlyFavorite = true })

导航到回收站页面的示例:

@Html.ActionLink("Recycle bin", "SearchAffaires", new { StatusCode = "DELETED" })

以下是我的路线:

        routes.MapRoute(
        "Affaire Status Open/Closed/Deleted",                                   // Route name
        "{controller}/{StatusCode}",                                            // URL with parameters
        new { action = "SearchAffaires" },                                      // Parameter defaults
        new { controller = "Affaire", StatusCode = "^Open$|^Closed$|^Deleted$" }// Contraints
        );

        routes.MapRoute(
        "Affaire Only Favorite",                                                // Route name
        "{controller}/Favorite",                                                // URL with parameters
        new { action = "SearchAffaires", Page = 1, OnlyFavorite = true },       // Parameter defaults
        new { controller = "Affaire" }                                          // Contraints
        );

您是否知道如何避免此行为?

我不希望路由通过reflexion从我当前的URL获取名为OnlyFavorite的属性。我已经尝试在动作链接上传递OnlyFavorite = null但它不起作用:路由说“好吧,我没有链接本身的OnlyFavorite值,但我在URL上只有OnlyFavorite所以我用它!“。

2 个答案:

答案 0 :(得分:0)

当您在Deleted页面上时,链接正在以这种方式处理,因为StatusCode令牌等于已删除,因此第一条路线得到满足。更改链接如下:

@Html.ActionLink("Favorites", "SearchAffaires", new { StatusCode = String.Empty, OnlyFavorite = true })

<强>已更新

最好的解决方案是扭转你的路线。作为一般规则,最具体的路线应该始终排在第一位,之后您应该拥有更多的通用路线。由于“Affaire Only Favorite”路线更具体,因此应始终先行。如果它是满足的第一条路线,那应解决您的问题。

更新#2

我运行了测试,当我按如下方式设置路线时,所有链接都正确生成:

        routes.MapRoute(
            "Affaire Only Favorite",                                       // Route name 
            "Affaire/Favorite",                                            // URL with parameters 
            new { controller = "Affaire", action = "SearchAffaires", 
                StatusCode = String.Empty, Page = 1, OnlyFavorite = true } // Parameter defaults 
        );

        routes.MapRoute(
            "Affaire Status Open/Closed/Deleted",                                    // Route name 
            "{controller}/{StatusCode}",                                             // URL with parameters 
            new { action = "SearchAffaires" },                                       // Parameter defaults 
            new { controller = "Affaire", StatusCode = "^Open$|^Closed$|^Deleted$" } // Constraints 
        );

此外,还可以正确生成以下更通用的路由:

        routes.MapRoute(
            "Favorite",                                                    // Route name 
            "{controller}/Favorite",                                       // URL with parameters 
            new { action = "Search", 
                StatusCode = String.Empty, Page = 1, OnlyFavorite = true } // Parameter defaults 
        );

        routes.MapRoute(
            "Status Open/Closed/Deleted",                    // Route name 
            "{controller}/{StatusCode}",                     // URL with parameters 
            new { action = "Search" },                       // Parameter defaults 
            new { StatusCode = "^Open$|^Closed$|^Deleted$" } // Constraints 
        );

对于更通用的路由,我必须将操作重命名为Search,我必须将每个链接从SearchAffaires更改为Search。

答案 1 :(得分:0)

好吧,你可以使用Html.RouteLink帮助器来指向所使用的路线。但是,正如@counsellorben指出的那样,你应该将更具体的路线设置为第一个。

如果您的网址显示“Affaire / Favorite / True”没有问题,那么您可以使用以下示例:

 routes.MapRoute(
        "Affaire Only Favorite",                                                // Route name
        "{controller}/Favorite/{OnlyFavorite}",                                                // URL with parameters
        new { action = "SearchAffaires", Page = 1, OnlyFavorite = ""},       // Parameter defaults
        new { controller = "Affaire" }                                          // Contraints
        );