Net core 2.0 - Razor Pages部分视图与业务本身(不是MVC)

时间:2018-04-30 02:44:52

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

我有一个侧边栏视图作为局部视图。我想将其插入主页面。 边栏从数据库中读取一些图像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中做到这一点的方法。 任何人都帮助我!

1 个答案:

答案 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