在Razor局部视图中保留数据

时间:2018-04-11 15:33:04

标签: razor asp.net-core partial-views razor-pages

我正在使用 ASP.NET Core 2.0 Visual Studio 2017

我想创建一个 Razor 局部视图来显示我们的应用程序的菜单。菜单是动态创建的,因为每个用户只有具有必要权限的菜单项(因此每个用户的菜单都不同)。

我遇到的问题是在 Razor 部分视图中保留菜单。 Razor 局部视图中没有 PageModel 代码隐藏,因此我遇到的问题是当您点击另一个页面时菜单消失。我在会话存储中保留了菜单,但我无法弄清楚如何将菜单从会话存储加载到Razor局部视图中。

我已尝试将会话存储菜单加载到 ViewData 中,但当您点击其他页面时,这会被删除。

如何在 Razor 部分视图中保留数据?

1 个答案:

答案 0 :(得分:2)

请考虑使用视图组件,而不是使用局部视图。

public class MenuComponent : ViewComponent
{
    SomeDependency userDetails;

    public MenuComponent(SomeDependency userDetails)
    {
      //store this userDetails data to extract profile info in Invoke method
      this.userDetails = userDetails;
    }

    public IViewComponentResult Invoke() 
    {
       //check for logged in  user profile here and return appropriate view
       return View(viewName,ModelObjectForView);
    }
}

1.创建所需的菜单视图

为每个角色或用途创建显示菜单的相应视图  条件渲染。  请注意查看视图组件的视图  /Views/ControllerName/Components/ViewComponentName/ViewName.cshtml这个  location而不是/Views/ControllerName/ViewName.cshtml。

2.定义布局页面

现在,由于您需要显示用户导航到的所有页面的菜单,您  需要在布局页面中提取此视图组件。创建 _Layout.cshthml  文件并确保需要显示菜单项的视图使用此布局页面。  在_Layout.cshtml中,您现在可以通过调用

呈现上面定义的视图组件

@await Component.InvokeAsync(nameof(MenuComponent))

3.使用ViewComponent而不是PartialView

我建议在这种情况下使用ViewComponent而不是PartialView,因为  ViewComponent将允许您拥有自己的模型(用户的RoleDetails)  你的情况)与PartialView相比  你将不得不从视图模型传递一些子数据,因此将有  将数据保存在每个视图模型中。否则,您甚至可以使用PartialView。这里重要的是布局页面,它将帮助您在向用户显示的所有视图中保留菜单。