Asp.net mvc 路由与反射问题

Asp.net mvc 路由与反射问题,asp.net-mvc,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc Routing,我在解决方案中添加了路由,以便在地址栏中有一个更友好的URL 我启动解决方案,当我滚动我的收藏夹链接时,我会看到URL../Affaire/Favorite(下图)。这个对我来说没问题 当我滚动我的回收站链接时,我看到URL。/affire/Deleted(下图)。这个对我来说没问题 然后我点击回收站链接,导航到相应的页面,地址栏中显示的URL对我来说是合适的(下图) 接下来,我再次滚动最喜爱的链接(下图),我看到URL。/affire/Delete?OnlyFavorite=true!!

我在解决方案中添加了路由,以便在地址栏中有一个更友好的URL

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

当我滚动我的回收站链接时,我看到URL。/affire/Deleted(下图)。这个对我来说没问题

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

接下来,我再次滚动最喜爱的链接(下图),我看到URL。/affire/Delete?OnlyFavorite=true!!那不好

路由现在不是从我的链接而是从活动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
        );
你知道我该如何避免这种行为吗


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

当您在
删除
页面上时,由于
StatusCode
令牌等于Deleted,因此以这种方式处理链路,因此满足第一条路由。按以下方式更改您的链接:

@Html.ActionLink("Favorites", "SearchAffaires", new { StatusCode = String.Empty, OnlyFavorite = true })
        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 
        );
已更新

最好的解决办法是改变你的路线。一般来说,最具体的路线应该总是先走,以后应该有更多的通用路线。因为“Affaire Only Favorite”路线更为具体,所以它应该始终走在第一位。如果这是第一条令人满意的路线,那么应该解决您的问题

更新#2

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

@Html.ActionLink("Favorites", "SearchAffaires", new { StatusCode = String.Empty, OnlyFavorite = true })
        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
,并且必须将每个链接从SearchAffairs更改为Search。

好的,您可以使用Html.RouteLink帮助程序精确地指向所使用的路由。然而,正如@consultorben所指出的,您应该将您更具体的路线设置为第一条

如果显示您的url如“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
        );

我试着用字符串。空的,但不起作用。路由仍在使用URL中的值(“已删除”)。我还尝试使用StatusCode=(string)null,但仍然不正常。我已经尝试反向路由,但问题仍然存在:路由系统总是尝试从RouteValue或活动URL获取任何属性。