部分ビューを使用してカテゴリサイドメニューを作成する本のチュートリアルに従っていました。現在選択されているカテゴリを表示する機能に到達するまでは問題ありませんでした。
現在選択されているカテゴリを部分ビューに渡すロジックがないように見えるため、問題が発生します。
カテゴリを表示するためのCSHTMLファイルのレイアウト
@{
Html.RenderAction("Menu", "Nav");
}
ご覧のとおり、選択したカテゴリIDは渡されていません
NavControllerを見ると、メニューメソッドは選択されたカテゴリIDを受け入れます
public PartialViewResult Menu(int selCatID = -1)
{
ViewBag.SelectedCatID = selCatID;
return PartialView(repository.Categories);
}
しかし、layout.htmlファイルからの呼び出しは、パラメーターなしでMenuを呼び出しているようで、selCatIDは常に-1になります。
これがメニューのビューです
@foreach (var cat in Model)
{
@Html.RouteLink( cat.CategoryName , new {
controller = "Company", action="List"
, catID=cat.ID, page= 1},
new { @class = cat.ID == ViewBag.SelectedCatID ? "selected" : null }
)
}
メインコントローラー(会社)から選択したCatIDがNavControllerのビューに渡されていることを示すコードは表示されていないようです。
メインコントローラーが選択したIDのビューバッグを設定する必要があると考えました。次の変更を行ったところ、機能しましたが、正しい手法かどうかはわかりません。私はそれを正しくやっているのか、それとも何かを逃したのか疑問に思いました。
レイアウトファイルで、次のパラメータを渡します。
Html.RenderAction("Menu", "Nav", new { selCatID = ViewBag.SelCatID });
メインエンティティコントローラー(CompanyController)で、現在選択されているIDのビューバッグを設定します
public class CompanyController : Controller
{
.....
public ViewResult List(int catID = -1, int page = 1)
{
CompaniesListViewModel viewModel = new CompaniesListViewModel
{
...........
};
ViewBag.SelectedCatID = catID;
return View(viewModel);