2013-07-18 5 views
14

Als eine Randnotiz verstehe ich das ganze ambiguous controller names Problem und Namespacing verwendet, um meine Routen arbeiten, so dass ich glaube nicht, dass das ein Problem hier ist.Verwenden von Url.RouteUrl() mit Route Namen in einem Bereich

Bisher habe ich meine Projektebene Controller und dann einen Benutzerbereich mit der folgenden Anmeldung:

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

Die „Userhome“ Weg ist es, damit ich die Strecke /User/5 gegen /User/Home/Index/5 die sauberere IMO sieht erlauben .

Idealerweise würde ich gerne Url.RouteUrl("UserHome", new { id = 5 }) verwenden, um die Route anderswo zu generieren, aber das kommt immer entweder leer zurück oder gibt mir eine Ausnahme, dass es den Routennamen nicht finden kann, der offensichtlich da ist.

Aber wenn ich Url.RouteUrl("UserHome", new { controller = "Home", action = "Index", id = 5 }) verwende, funktioniert es kein Problem.

Warum muss ich die Aktion und den Controller angeben, wenn sie bereits Standardwerte in der Routenzuordnung haben? Was vermisse ich?

+0

Versuchen Sie, den Namespace hinzuzufügen. – Oasis

Antwort

2

Ich kann bestätigen, dass mit .NET 4.5.1 und 5.2.2 MVC auf das Minimum, dass dieses Verhalten behoben wurde und arbeitet heute als mit diesem gleichen genauen Code ist mit Url.RouteUrl("UserHome", new { id = 5 }).

Es sieht so aus, als wäre dies ein Fehler, der seit der Zeit meines Beitrags behoben wurde.

Dies als Antwort hinzufügen, obwohl die Lösung von TSmith funktionieren würde, müssen Sie diese zusätzliche Arbeit jetzt nicht mehr ausführen, da es eine Lösung gibt.

+1

Scheint nicht mit Attribut-Routing in meinem mvc 5.2.3 [Route ("Benutzer/{ID}", Name = "UserHome")] –

6

Nicht sicher, ob es einen Hotfix gab, aber das Verhalten ist jetzt ein bisschen anders. Arbeiten mit dem genauen Code und versuchen:

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

ich jetzt bekommen:

/User/5?httproute=True 

Diese noch umständlich aussieht, so experimentierte ich mit der Strecke und fügte einen anderen Standard-param:

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

Wenn ich nun

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

ich eine schöne url von

/User/5 

Haftungsausschluss Es unerwünschte Nebenwirkungen von httproute=true in der Route Erklärung sein könnte.

Auch die ausführlichere Verwendung:

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

noch als gut funktioniert.

2

Versuchen Sie folgendes:

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

Große Antwort :) –