2013-07-18 1 views
14

Comme une note de côté, je comprends l'ensemble ambiguous controller names problème et ont utilisé l'espace de nommage pour obtenir mes itinéraires de travail, donc je ne pense pas que ce soit un problème ici.En utilisant Url.RouteUrl() avec la route noms dans une zone

Jusqu'à présent, j'ai mes contrôleurs de niveau du projet, puis une zone d'utilisateur avec l'inscription suivante:

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à pour que je puisse permettre à la route /User/5 par rapport /User/Home/Index/5 qui semble plus propre OMI .

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

Cependant quand je l'utilise Url.RouteUrl("UserHome", new { controller = "Home", action = "Index", id = 5 }) il fonctionne sans problème.

Pourquoi dois-je préciser l'action et contrôleur quand ils ont déjà défaut dans la cartographie de la route? Qu'est-ce que je rate?

+0

Essayez d'ajouter l'espace de noms. – Oasis

Répondre

2

Je peux confirmer que avec .NET et MVC 4.5.1 5.2.2 au minimum, que ce comportement a été corrigé et travaille maintenant comme il est avec ce même code à l'aide 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 ce que la réponse car, bien que la solution de tsmith fonctionnerait, vous ne devez plus faire ce travail supplémentaire maintenant qu'il ya une solution.

+1

Semble ne pas fonctionner avec le routage d'attribut dans mon mvc 5.2.3 [Route ("Utilisateur/{id}", Name = "UserHome")] –

6

Vous ne savez pas s'il y a eu un correctif, mais le comportement est un peu différent. En utilisant votre code exact et essayer:

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

Je reçois maintenant:

/User/5?httproute=True 

Cela semble encore maladroit, donc j'expérimenté avec la route et a ajouté un autre défaut param:

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

je reçois une belle url de

/User/5 

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

En outre, l'utilisation plus prolixe:

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

fonctionne toujours aussi bien.

2

Essayez ceci:

@Url.Action("Index", "Home", new { Area = "User" }) 
+0

Grande réponse :) –

Questions connexes