【问题标题】:Net core 2.0 - Razor Pages partial view with business itself (not MVC)Net core 2.0 - Razor Pages 部分视图与业务本身(不是 MVC)
【发布时间】:2018-04-30 14:16:27
【问题描述】:

我有一个侧边栏视图作为部分视图。我想把它插入主页。 侧边栏从数据库中读取一些图像 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 中找到这样做的方法。 谁来帮帮我!

【问题讨论】:

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


    【解决方案1】:

    有几种方法,包括将其作为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() { }
    
    }
    

    您可以在 _SidebarModel 中扩展它而不是 PageModel

    【讨论】:

    • 但是你用来处理事件的代码在哪里,比如 OnPostAsync、onGetAsync..?
    • 这些功能与页面相关,我认为将其添加到视图模型没有多大意义。这是违反逻辑的。最好的方法是创建自己的视图模型类,其中包含包括侧边栏在内的全部内容并对其进行扩展。无论哪种方式,我都提供了一个例子来说明你可以用注射做些什么
    • 我发现一个解决方案是使用视图组件而不是部分视图。但是 viewcomponent 只是处理程序获取数据,还没有发布数据
    • 视图组件为您提供了一个Request 属性,您可以使用
    猜你喜欢
    • 2023-03-10
    • 2020-05-08
    • 2019-07-25
    • 2020-05-08
    • 2020-10-04
    • 2018-03-30
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    相关资源
    最近更新 更多