web-dev-qa-db-fra.com

Utilisation de Url.RouteUrl () avec des noms de route dans une zone

En remarque, je comprends tout le problème noms de contrôleurs ambigus et j'ai utilisé l'espace de noms pour faire fonctionner mes routes, donc je ne pense pas que ce soit un problème ici.

Jusqu'à présent, j'ai mes contrôleurs de niveau projet, puis une zone utilisateur avec l'enregistrement suivant:

public class UserAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "User";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "UserHome",
            "User/{id}",
            new { action = "Index", controller = "Home", id = 0 },
            new { controller = @"Home", id = @"\d+" }
        );

        context.MapRoute(
            "UserDefault",
            "User/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }
}

La route "UserHome" est là, donc je peux autoriser la route /User/5 Contre /User/Home/Index/5 Qui semble plus propre OMI.

Idéalement, je voudrais utiliser Url.RouteUrl("UserHome", new { id = 5 }), pour générer la route ailleurs, mais cela revient toujours en blanc ou me donne une exception disant qu'il ne peut pas trouver le nom de la route, qui est évidemment là.

Cependant, lorsque j'utilise Url.RouteUrl("UserHome", new { controller = "Home", action = "Index", id = 5 }) cela ne fonctionne pas.

Pourquoi dois-je spécifier l'action et le contrôleur alors qu'ils ont déjà des valeurs par défaut dans le mappage d'itinéraire? Qu'est-ce que je rate?

16
ryanulit

Je peux confirmer qu'avec .NET 4.5.1 et MVC 5.2.2 au minimum, ce comportement a été corrigé et fonctionne maintenant tel quel avec ce même code exact en utilisant Url.RouteUrl("UserHome", new { id = 5 }).

Il semble que ce soit un bug qui a été corrigé depuis le moment de mon message.

L'ajout de cela comme réponse car bien que la solution de TSmith fonctionnerait, vous n'avez plus besoin de faire ce travail supplémentaire maintenant qu'il existe un correctif.

2
ryanulit

Tout le monde, veuillez voir la réponse de @ ryanulit ci-dessous. Ce problème peut être résolu pour vous avec une version de framework plus récente.

Je ne sais pas s'il y a eu un correctif, mais le comportement est maintenant un peu différent. En utilisant votre code exact et en essayant:

Url.RouteUrl("UserHome", new { id = 5 })

Je reçois maintenant:

/User/5?httproute=True 

Cela semble toujours gênant, j'ai donc expérimenté l'itinéraire et ajouté un autre paramètre par défaut:

 context.MapRoute(
            "UserHome",
            "User/{id}",
            new { action = "Index", controller = "Home", area = "User", id = 0, 
                       httproute = true },
            new { controller = @"Home", id = @"\d+" }
        );

Maintenant, quand j'utilise

Url.RouteUrl("UserHome", new { id = 5 })

J'ai une belle URL de

/User/5

clause de non-responsabilité Il pourrait y avoir des effets secondaires indésirables de httproute=true dans la déclaration d'itinéraire.

En outre, l'utilisation la plus verbeuse:

@Url.RouteUrl("UserHome", new { controller = "Home", action = "Index", id = 5 })

fonctionne toujours aussi bien.

8
TSmith

Essaye ça:

@Url.Action("Index", "Home", new { Area = "User" })
3
Robson Douglas