我如何将带有数据的模型从数据库传递到 ABP.IO 布局挂钩?
Posted
技术标签:
【中文标题】我如何将带有数据的模型从数据库传递到 ABP.IO 布局挂钩?【英文标题】:Ho do i pass a model with data from the DB to an ABP.IO Layout Hook? 【发布时间】:2020-12-28 11:15:45 【问题描述】:尝试使用 ABP.io 框架 3.1 设置多租户站点。
我正在尝试在页面 html 头中设置 https://docs.abp.io/en/abp/latest/UI/AspNetCore/Customization-User-Interface#layout-hooks,他们将谷歌分析脚本代码注入到 head 标签中。
这很好,因为它是静态文本,但是当我尝试使用模型加载部分页面时,它会抛出一个错误,即期望与传入的模型不同。
到目前为止,我有通知视图组件
Public class MetaKeywordViewComponent : AbpViewComponent
public async Task<IViewComponentResult> InvokeAsync()
return View("/Pages/Shared/Components/Head/MetaKeyword.cshtml"); //, meta);
和cshtml页面
@using MyCompany.MyProduct.Web.Pages.Shared.Components.Head
@model MetaKeywordModel
@if (Model.SiteData.Keywords.Length > 0)
<meta content="@Model.SiteData.Keywords" name="keywords" />
cshtml.cs 文件为
public class MetaKeywordModel : MyProductPageModel
private readonly ITenantSiteDataAppService _tenantSiteDataAppService;
public TenantSiteDataDto SiteData get; private set;
public MetaKeywordModel(ITenantSiteDataAppService tenantSiteDataAppService)
_tenantSiteDataAppService = tenantSiteDataAppService;
public virtual async Task<ActionResult> OnGetAsync()
if (CurrentTenant != null)
SiteData = await _tenantSiteDataAppService.GetSiteDataAsync();
return Page();
但是当我运行程序时出现以下错误。
An unhandled exception has occurred while executing the request.
System.InvalidOperationException: The model item passed into the ViewDataDictionary is of type 'Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewModel', but this ViewDataDictionary instance requires a model item of type 'MyCompany.MyProduct.TenantData.Dtos.TenantSiteDataDto'.
如果我不能使用我的模型,我如何将数据库中的数据传递到要呈现的页面?
任何帮助提示或技巧将不胜感激。
问候 马蒂
【问题讨论】:
【参考方案1】:ViewComponent 不同于剃须刀页面。
见https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components?view=aspnetcore-3.1#view-components
您应该直接在视图组件类中注入服务。喜欢:
public class MetaKeywordViewComponent : AbpViewComponent
private readonly ITenantSiteDataAppService _tenantSiteDataAppService;
public MetaKeywordViewComponent(ITenantSiteDataAppService tenantSiteDataAppService)
_tenantSiteDataAppService = tenantSiteDataAppService;
public async Task<IViewComponentResult> InvokeAsync()
return View("/Pages/Shared/Components/Head/MetaKeyword.cshtml",
await _tenantSiteDataAppService.GetSiteDataAsync());
另外,可以参考https://github.com/abpframework/abp/blob/42f37c5ff01ad853a5425d15539d4222cd0dab69/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Components/PageAlerts/PageAlertsViewComponent.cs
【讨论】:
完美,我知道这会是我忽略的简单而愚蠢的事情。以上是关于我如何将带有数据的模型从数据库传递到 ABP.IO 布局挂钩?的主要内容,如果未能解决你的问题,请参考以下文章
如何从当前用户检索(Jwt)访问令牌并将其传递给 asp.net 样板(abp)中的移动应用程序?