开发者

Routing and reflection problem

I added routing to my solution in order to have a more user friendly URL in the address bar.

I start the solution and when I rollover my Favorites link, I see the URL .../Affaire/Favorite (picture below). This one is OK for me.

Routing and reflection problem

When I rollover my Recycle bin link, I see the URL ../Affaire/Deleted (picture below). This one is OK for me.

Routing and reflection problem

Then I click on the Recycle bin link, I navigate to the corresponding page and the URL showed in the address bar is OK for me (picture below).

Routing and reflection problem

Next, I rollover the Favorite link again (picture below), I see the URL ../Affaire/Delete?OnlyFavorite=true!! That's not OK.

Routing and reflection problem

The routing is now retrieving an attribute not from my link but from the active URL! This attribute is named OnlyFavorite and I don't want this attribute. This is the "reflexion". Notice that all of my routes are using the same controller and the same action but using different attributes for the routes.

Below are some links I used.

Example for navigating to the favorite page:

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

Example for navigating to the recycle bin page:

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

Here are my routes:

        routes.MapRoute(
        "Affaire Status Open/Closed/Dele开发者_高级运维ted",                                   // 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
        );

Do you have any idea how can I proceed to avoid this behaviour?

I don't want the routing to get the attribute named OnlyFavorite from my current URL by reflexion. I already try to pass OnlyFavorite=null on the action link but it doesn't work: the routing says "ok, I don't have a value for OnlyFavorite on the link itself but I have OnlyFavorite on the URL so I use it!".


When you are on the Deleted page, the link is being processed that way because the StatusCode token is equal to Deleted, so the first route is satisfied. Change your link as follows:

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

UPDATED

The best solution is to reverse your routes. As a general rule, the most specific routes should always go first, and you should have more generic routes later. Since the "Affaire Only Favorite" route is more specific, it should always go first. If it is the first route satisfied, that should address your issue.

UPDATE #2

I ran a test, and all of the links were generated correctly, when I set the routes as follows:

        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 
        );

In addition, the following more generic routes also generated correctly:

        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 
        );

For the more generic routes to work, I had to rename the action as Search and I had to change each link from SearchAffaires to Search.


Well, you could use Html.RouteLink helper to point exactly to the route used. However, as @counsellorben pointed out, you should set your more specific route to be the first one.

And if there's no problem to show your url like "Affaire/Favorite/True", then you can use the example below:

 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
        );
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜