0

我正在关注一本书中关于使用局部视图创建类别侧边菜单的教程。它一直很好,直到它具有显示当前选择的类别的功能。

出现问题是因为似乎没有任何逻辑将当前选择的类别传递给局部视图。

CSHTML 文件用于显示类别的布局

@{ 
    Html.RenderAction("Menu", "Nav"); 
  }

如您所见,未传递所选类别 ID

如果您查看 NavController 菜单方法接受选择类别 ID

  public PartialViewResult Menu(int selCatID = -1)
    {
        ViewBag.SelectedCatID = selCatID;
        return PartialView(repository.Categories);

    }

但是来自 layout.html 文件的调用似乎是在没有参数的情况下调用菜单,导致 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的viewbag

public class CompanyController : Controller
{
    .....
 public ViewResult List(int catID = -1, int page = 1)
      {
       CompaniesListViewModel viewModel = new CompaniesListViewModel
        {
         ...........
        };

        ViewBag.SelectedCatID = catID;
        return View(viewModel);
4

1 回答 1

1

问题是这段代码

  Html.RenderAction("Menu", "Nav", new { selCatID = ViewBag.SelCatID });

我已经添加了参数,因为没有它传入一个空值并在第一次运行时崩溃。所以我把它改回了:Html.RenderAction("Menu", "Nav");

为了处理空值,我将参数更改为可为空的 int

    public PartialViewResult Menu(int? selCatID = -1)
    {
        ViewBag.SelectedCatID = selCatID;

现在一切正常。

于 2012-07-16T09:40:06.200 回答