2011-07-20 11 views
20

Mam renderowania menu z częściowego działania bezpośrednio do układu za pomocą "Area =":T4MVC @ Url.Action (MVC.Controller.Action()) Renders Parametr w QueryString

@Html.Action(MVC.Menu.Index()) 

ten action, określa menu częściowe do renderowania. Na przykład menu publiczne jest częściowe. W ramach tych podszablonów, jestem również za pomocą T4MVC do renderowania linki:

<ul id="navHolder"> 
<li class="level1"> 
    <ul class="mainMenu"> 
     <li><b>@Html.ActionLink("Welcome", MVC.Home.Index())</b> 
      ... 

z jakiegoś powodu, adresy URL świadczone przez T4MVC obejmują „Area =” na końcu:

<ul id="navHolder"> 
    <li class="level1"> 
     <ul class="mainMenu"> 
      <li><b><a href="/home/index?Area=">Welcome</a></b> 
       ... 

nie mam obszary w moim projekcie i ustawiłem wartość "IncludeAreasToken" na wartość false. Co dziwne, dzieje się tak tylko wtedy, gdy wyrenderuję częściowe użycie "@ Html.Action" - jeśli wciągnę to jako "@ Html.Partial" parametr nie zostanie wyrenderowany, a link jest czysty i poprawny. (Nie chcę tego jednak interpretować jako częściowego, więc nie proponujcie tego jako sugestii;)

Czy ktoś tam kiedyś to robił?

Odpowiedz

10

Coś dziwnego dzieje się tutaj i zastanawiam się, czy istnieje jakiś błąd MVC w katalogu głównym. Nawet bez użycia T4MVC, to się dzieje, jeśli napisać:

@Html.ActionLink("Welcome", "Index", "Home", new { Area = "" }, null) 

w zwykłym świetle, to nie generuje fałszywe = obszar, podczas gdy w Html.Action nazywają to robi?. Muszę zapytać kogoś w zespole.

Na razie można obejść poprzez usunięcie tej linii (około 310 linii) w t4mvc.tt:

<# if (MvcVersion >= 2) { #>result.RouteValueDictionary.Add("Area", area ?? "");<# } #> 
+0

Dziękuję - pomogło. –

+0

Właśnie dodałem czek, aby zobaczyć, czy obszar został dostarczony, jeśli tak, dodaję go do słownika: 'if (! String.IsNullOrWhiteSpace (area)) {result.RouteValueDictionary.Add (" Area ", area ??" "); '' –

+0

@BradR: Problem z tą zmianą jest taki, że myślę, że nie zawsze jest to poprawne. Gdy znajdujesz się w widoku Obszar i próbujesz wygenerować link do widoku najwyższego poziomu (poza obszarem), przekazanie pustego obszaru jest właściwą rzeczą, aby "uciec" z bieżącego obszaru. Ale z czekiem, które się nie wydarzy. –

30

rozwiązać ten problem w bardzo prosty sposób, po prostu dodając do wszystkich tras, które nie są w obszarze pustego obszaru trasy:

routes.MapRoute(
"Default", 
"{controller}/{action}/{i​d}", 
new { controller = "Home", action = "Index", area = "", id = UrlParameter.Optional }); 
+0

Właśnie przetestowałem to i wydaje się, że to najprostsze rozwiązanie - po prostu dodaj obszar String.Empty do domyślnej trasy i wszystkie adresy URL generują poprawnie. –

+0

To działało, dziękuję! –

+0

To rozwiązanie jest dla mnie bardzo proste. –

Powiązane problemy