2011-07-20 6 views
20
におけるパラメータ

私が使用して、レイアウトに直接部分的なアクションからメニューをレンダリングしています:T4MVC @ Url.Actionは(MVC.Controller.Action())レンダリング "?エリア=" のQueryString

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

このどのメニュー部分をレンダリングするかを決定します。たとえば、パブリックメニューの一部です。 NO

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

私が持っている:、T4MVCによってレンダリングURLが含ま末尾に「エリア=?」何らかの理由

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

:これらのパーシャルの中で、私はまた、リンクをレンダリングするためにT4MVCを使用しています私のプロジェクトの領域と私は "IncludeAreasToken"設定をfalseにしました。奇妙なことに、これは "@ Html.Action"を使ってパーシャルをレンダリングする場合にのみ発生します。 "@ Html.Partial"としてプルすると、パラメータはレンダリングされず、リンクはクリーンで正しいものになります。 (私は部分的にそれをレンダリングしたくないので、それを示唆として提供してはいけません)

これまで誰もこれに遭遇していますか?

答えて

10

何か変わったことがありますが、ルートに何らかの種類のMVCバグがあるのだろうかと思います。でもT4MVCを使用せずに、あなたが書いた場合は、この処理が行われます?Html.Actionで行い、それを呼び出している間、通常のビューで

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

を、これは、偽のエリア=を生成しません。私はチームの誰かに尋ねる必要があります。

今のところ、あなたはt4mvc.ttに(線310の周りに)この行を削除することによって回避することができます

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

ありがとう - それは助けた。 –

+0

領域が供給されたかどうかを確認するためのチェックが追加されました。もしそうなら、それを辞書に追加します: 'if(!String.IsNullOrWhiteSpace(area)){result.RouteValueDictionary.Add(" Area "、area ??" );} ' –

+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

このソリューションは、私にとっては非常に簡単です。 –