我有一个侧边栏视图作为局部视图。我想将其插入主页面。 边栏从数据库中读取一些图像URL并将其显示为html页面。 在主页面中,我使用此代码插入侧边栏:
@await Html.PartialAsync("Shared/_Sidebar")
侧栏cshtml页面:
@model MyWeb.Pages.Shared._SidebarModel
...
但它引起了错误:
The model item passed into the ViewDataDictionary is of type 'MyWeb.Pages.IndexModel', but this ViewDataDictionary instance requires a model item of type 'MyWeb.Pages.Shared._SidebarModel'
我研究过这个问题,得到的答案是,必须从父页面传递模型,如下:
@await Html.PartialAsync("Shared/_Sidebar", Model.Urls)
如果是这样,父页面必须处理子页面的业务。所以,如果我不将侧边栏插入主页面,而是插入另一个页面,我必须删除主页面上的代码,并将业务代码添加到新页面,依此类推......边栏无法处理自己的事业。 在MVC中,我们可以使用RenderAction将部分视图及其操作插入到处理程序业务逻辑中。但我还没有找到在RazorPages中做到这一点的方法。 任何人都帮助我!
答案 0 :(得分:0)
有几种方法可以将其作为ViewData
传递。我发现注射是最干净的方法之一:
将_SidebarModel
初始化为服务。如果您计划使用任何作用域服务(例如DBContext
),则可以使用作用域。您可以在启动类中使用它:
services.AddSingleton<_SidebarModel>();
或者如果你想在这里初始化它:
services.AddSingleton<>(new _SidebarModel { });
现在,您可以使用:
代替@model MyWeb.Pages.Shared._SidebarModel
@inject MyWeb.Pages.Shared._SidebarModel MyModel
您也可以始终从视图模型中注入和控制模型。
您可以使用类似以下类的页面视图模型添加一些基本功能:
public class InjectablePage : PageModel
{
private readonly HttpContext httpContext;
public InjectablePage(HttpContext httpContext)
{
this.httpContext = httpContext;
if (httpContext.Request.Method == "GET") OnGet();
}
public virtual void OnGet() { }
}
您可以在PageModel
_SidebarModel