我正在阅读一本关于使用局部视图创建类别侧面菜单的书中的教程。 它一直很好,直到它显示当前所选类别的功能。
出现问题的原因是将当前选定的类别传递给局部视图似乎没有任何逻辑。
布局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设置viewbag。我做了以下更改,但它工作但我不确定它是否是正确的技术。 我想知道我是做得对还是错过了什么?
布局文件中的传递参数:
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);
答案 0 :(得分:1)
问题是这段代码
Html.RenderAction("Menu", "Nav", new { selCatID = ViewBag.SelCatID });
我已经添加了参数,因为没有它传入一个空值并在第一次运行时崩溃。所以我把它改回来: Html.RenderAction(“菜单”,“导航”);
为了处理null,我将参数更改为nullable int
public PartialViewResult Menu(int? selCatID = -1)
{
ViewBag.SelectedCatID = selCatID;
现在一切正常。