2012-01-11 21 views
1

編集:これは明らかに私のサイトの大幅に簡略化されたバージョンです。テストアプリを作成すると、このパターンでうまくいきます。実際のアプリケーションではT4MVCを使用していますが、これはすべて地域内にあります。私はこれらの要因の1つが私の問題を引き起こしていると推測しています...Razorで入れ子になったHtml.Action呼び出し

EDIT2:すべてのデフォルトルートが定義されていて、/ AreaName/ControllerName/SubChild?val = 123に直接ナビゲートするとレンダリングされます。

私はMVCとの特有の問題があり、誰かが私はその後、3つのかみそりの景色を眺めることができ、次のアクションメソッド

public ActionResult Index() 
{ 
    return View(GetModel()); 
} 

public ActionResult Result Child(string blah) 
{ 
    return View(GetModel(blah)); 
} 

public ActionResult Result SubChild(int val) 
{ 
    return View(GetModel(val)); 
} 

とコントローラを持っている...

を助けることができる期待しています。

Index.cshtml

<div> 
@Html.Action("Child", new { blah = "raaa"}) 
</div> 

Child.cshtml

<div> 
@*ERROR HERE*@ 
    @Html.Action("SubChild", new { val = 123}) 
    </div> 

SubChild.cshtml

<h1>@Model.val</h1> 

私が移動すると/私は 「Noルートというスローされた例外を取得します提供された値と一致します。 SubChildアクションを呼び出すHtml.Actionで

これはすべて同じエリア内にあり、同じコントローラ内にあります。マークアップを変更し、子ビューへの呼び出しにHtml.Partialを使用し(モデルを構築してビューに渡す)、それは問題なくレンダリングされます。この問題は、すでにHtml.Actionを使用してレンダリングされているビュー内でHtml.Actionを呼び出すと発生します。

/area/controller/actionを使用してアクションを完全に修飾しようとしましたが、Html.Actionコールでコントローラを指定し、そのエリアをパラメータとしてルート値に渡し、これらのすべてを組み合わせました。

これはどういう考えですか?私はそれを使用してレンダリングされているビューでHtml.Actionを呼び出すことができると仮定しています。私は間違っているかもしれないと思います...

答えて

1

問題は、私たちのエリアとルーティング設定と関係があるようです。

第2パスでは、routevaluedictionary内の領域への参照が失われているため、正しいルートが見つかりません。エリアを登録する場合は、正しいルートを登録する必要があります。

私は他の誰かを助けるかもしれないと思うので、これを助けてくれてありがとう、私は他の答えをupvotedしました。

3

まあまあ、MVC 3はデフォルトのルートパラメータidを持っています。 SubChildアクションのパラメータはvalとなっている可能性があります。

IDへのアクションのパラメータの名前を変更、または

routes.MapRoute(
    "SubChild", 
    "{controller}/SubChild/{val}", 
    new 
    { 
     controller = "ControllerName", 
     action = "SubChild", 
     val = UrlParameter.Optional 
    } 
); 
2

新しいルートを追加してください、本当にblahvalという名前のパラメータはありますか?通常、最初のパラメータは常にidと呼ばれるためです。 global.asax.csの方法RegisterRoutes(RouteCollection routes)を確認してください。

routes.MapRoute("Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }); // Parameter defaults 

これはパラメータの名前付け方法を示しています。

は、私はあなたの行動がこのようでなければならないと思う:

public ActionResult Index() 
{ 
    return View(GetModel()); 
} 

public ActionResult Result Child(string id) 
{ 
    return View(GetModel(id)); 
} 

public ActionResult Result SubChild(int id) 
{ 
    return View(GetModel(id)); 
} 

次に、あなたのビューでコードがなければならない: Index.cshtml

<div> 
    @Html.Action("Child", new { id = "raaa"}) 
</div> 

<div> 
    @Html.Action("SubChild", new { id = 123}) 
</div> 
Child.cshtml
関連する問題