2011-07-20 31 views
20

我渲染菜單從局部行動直接向佈局,採用 「面積=?」:T4MVC @ Url.Action(MVC.Controller.Action())呈現參數的查詢字符串

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

這動作,確定要渲染哪個菜單局部。例如,一個公共菜單部分。這些泛音之內,我也使用T4MVC呈現鏈接:

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

出於某種原因,由T4MVC呈現的網址包含「面積=?」的結尾:

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

我沒有在我的項目中,我已將「IncludeAreasToken」設置設置爲false。奇怪的是,如果我使這只是發生在局部使用「@ Html.Action」 - 如果我把它作爲「@ Html.Partial」參數沒有提供,而該鏈接是乾淨的,正確的。 (我不想以使其作爲一個部分了,所以請不要提供,作爲一個建議;)

任何人在那裏以前碰到這個?

回答

10

奇怪的事情是怎麼回事,我不知道是否有在根某種MVC的bug。即使不使用T4MVC,出現這種情況,如果你寫:

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

在常規看來,這不會產生虛假的面積=,而在Html.Action調用它呢?。我需要問球隊中的某個人。

現在,你可以通過在t4mvc.tt刪除這條線(大約310線)解決辦法:

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

謝謝 - 幫助。 –

+0

我只是增加了一個檢查,看看是否被提供的區域,如果是的話我把它添加到字典:(!String.IsNullOrWhiteSpace(地區))'如果{result.RouteValueDictionary.Add(「區」,面積?「」 );}' –

+0

@BradR:這個改變的問題是我認爲這並不總是正確的。當您在區域視圖中並且您嘗試生成到頂層(非區域)視圖的鏈接時,傳遞空白區域是「逃避」當前區域的正確方法。但是你的支票不會發生。 –

30

我解決一個非常簡單的方法這個問題,只需加入到不是所有路由在這樣的區域空白區域路線:

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

剛剛測試過這一點,它似乎是最簡單的解決方案 - 只需要加一個將String.Empty的區域添加到默認路由並正確生成所有URL。 –

+0

工作,謝謝! –

+0

這個解決方案對我來說很容易。 –