2013-07-18 13 views
14

Na marginesie, rozumiem cały problem ambiguous controller names i użyłem przestrzeni nazw, aby moje trasy działały, więc nie sądzę, że jest to problem tutaj.Używanie Url.RouteUrl() z nazwami tras w obszarze

Do tej pory mam kontrolerów poziomie projektu, a następnie w obszarze User z poniższej rejestracji:

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

W „UserHome” Trasa jest tak mogę zezwolić na ROUTE /User/5 Vs. /User/Home/Index/5 który wygląda czystsze IMO .

Idealnie chciałbym użyć Url.RouteUrl("UserHome", new { id = 5 }), aby wygenerować trasę w innym miejscu, ale to zawsze albo wraca puste, albo daje mi wyjątek mówiąc, że nie może znaleźć nazwy trasy, która oczywiście jest tam.

Jednak przy korzystaniu z Url.RouteUrl("UserHome", new { controller = "Home", action = "Index", id = 5 }) nie stanowi to problemu.

Dlaczego muszę określić akcję i kontroler, gdy mają już ustawienia domyślne w mapowaniu trasy? czego mi brakuje?

+0

Spróbuj dodać przestrzeń nazw. – Oasis

Odpowiedz

2

Mogę potwierdzić, że z .NET 4.5.1 i 5.2.2 MVC na minimum, że zachowanie to zostało ustalone i teraz działa jak jest z tym samym kodzie za pomocą dokładnego Url.RouteUrl("UserHome", new { id = 5 }).

Wygląda na to, że błąd został naprawiony od czasu mojego posta.

Dodanie tego jako odpowiedzi, ponieważ chociaż rozwiązanie TSmith będzie działało, nie musisz już wykonywać tej dodatkowej pracy, gdy pojawi się poprawka.

+1

Wygląda na to, że nie pracuję z routingiem atrybutów w moim mvc 5.2.3 [Route ("User/{id}", Name = "UserHome")] –

6

Nie jestem pewien, czy była tam poprawka, ale zachowanie jest teraz nieco inne. Korzystanie dokładny kod i starając:

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

teraz uzyskać:

/User/5?httproute=True 

To wciąż wygląda niewygodne, więc eksperymentował z trasą i dodaje inny domyślny param:

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

Teraz, gdy używam

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

uzyskać ładny url

/User/5 

zrzeczenie mógłby tam być niepożądane skutki uboczne httproute=true w zgłoszeniu trasy.

Również bardziej gadatliwy zastosowanie:

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

nadal działa tak samo.

2

Spróbuj tego:

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

Świetna odpowiedź :) –