在 Razor 局部视图中保留数据
Persisting data in a Razor Partial View
我正在使用 ASP.NET Core 2.0 和 Visual Studio 2017.
我想创建一个 Razor 局部视图来显示我们应用程序的菜单。菜单是动态创建的,因为每个用户将只有他们拥有必要权限的菜单项(因此每个用户的菜单都不同)。
我遇到的问题是在 Razor 局部视图中保留菜单。 PageModel 在 Razor 部分视图中没有代码隐藏,所以我遇到的问题是当您单击另一个菜单时菜单消失页。我已将菜单保存在会话存储中,但我不知道如何将菜单从会话存储加载到 Razor 局部视图中。
我试过将会话存储菜单加载到 ViewData,但是当您单击另一个页面时,它会消失。
如何在我的 Razor 部分视图中保留数据?
考虑使用视图组件,而不是使用局部视图。
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.Create 需要菜单浏览量
为每个角色或用途创建适当的视图来显示菜单
条件渲染。
请注意视图组件的视图将被查看
/Views/ControllerName/Components/ViewComponentName/ViewName.cshtml 这个
位置而不是 /Views/ControllerName/ViewName.cshtml.
2.Define布局页面
现在,由于您需要为用户导航到的所有页面显示菜单,您
需要在布局页面中提取此视图组件。创建一个 _Layout.cshthml
文件并确保需要显示菜单项的视图使用此布局页面。
在 _Layout.cshtml 中,您现在可以 渲染上面定义的视图组件 通过调用
@await Component.InvokeAsync(nameof(MenuComponent))
3.Using ViewComponent 而不是 PartialView
我建议在这种情况下使用 ViewComponent 而不是 PartialView,因为
ViewComponent 将允许您拥有自己的模型(用户的 RoleDetails
你的情况)与 PartialView 相比
你将不得不从视图模型传递一些子数据,因此将有
将该数据保存在每个视图模型中。否则,您甚至可以使用 PartialView。这里重要的是布局页面,它将帮助您在呈现给用户的所有视图中保留菜单。
我正在使用 ASP.NET Core 2.0 和 Visual Studio 2017.
我想创建一个 Razor 局部视图来显示我们应用程序的菜单。菜单是动态创建的,因为每个用户将只有他们拥有必要权限的菜单项(因此每个用户的菜单都不同)。
我遇到的问题是在 Razor 局部视图中保留菜单。 PageModel 在 Razor 部分视图中没有代码隐藏,所以我遇到的问题是当您单击另一个菜单时菜单消失页。我已将菜单保存在会话存储中,但我不知道如何将菜单从会话存储加载到 Razor 局部视图中。
我试过将会话存储菜单加载到 ViewData,但是当您单击另一个页面时,它会消失。
如何在我的 Razor 部分视图中保留数据?
考虑使用视图组件,而不是使用局部视图。
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.Create 需要菜单浏览量
为每个角色或用途创建适当的视图来显示菜单 条件渲染。 请注意视图组件的视图将被查看 /Views/ControllerName/Components/ViewComponentName/ViewName.cshtml 这个 位置而不是 /Views/ControllerName/ViewName.cshtml.
2.Define布局页面
现在,由于您需要为用户导航到的所有页面显示菜单,您 需要在布局页面中提取此视图组件。创建一个 _Layout.cshthml 文件并确保需要显示菜单项的视图使用此布局页面。 在 _Layout.cshtml 中,您现在可以 渲染上面定义的视图组件 通过调用
@await Component.InvokeAsync(nameof(MenuComponent))
3.Using ViewComponent 而不是 PartialView
我建议在这种情况下使用 ViewComponent 而不是 PartialView,因为 ViewComponent 将允许您拥有自己的模型(用户的 RoleDetails 你的情况)与 PartialView 相比 你将不得不从视图模型传递一些子数据,因此将有 将该数据保存在每个视图模型中。否则,您甚至可以使用 PartialView。这里重要的是布局页面,它将帮助您在呈现给用户的所有视图中保留菜单。