如何将包含数据的模型从数据库传递到 ABP.IO 布局挂钩?
Ho do i pass a model with data from the DB to an ABP.IO Layout Hook?
尝试使用 ABP.io 框架 3.1 设置多租户站点。
我正在尝试在页面 html 头部设置 https://docs.abp.io/en/abp/latest/UI/AspNetCore/Customization-User-Interface#layout-hooks 他们将 google 分析脚本代码注入到 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'.
如果我不能使用我的模型,如何将数据从我的数据库传递到要呈现的页面?
任何帮助提示或技巧将不胜感激。
问候
马蒂
ViewComponent 与 razor 页面不同。
您应该直接在视图组件 class 中注入服务。喜欢:
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());
}
}
尝试使用 ABP.io 框架 3.1 设置多租户站点。
我正在尝试在页面 html 头部设置 https://docs.abp.io/en/abp/latest/UI/AspNetCore/Customization-User-Interface#layout-hooks 他们将 google 分析脚本代码注入到 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'.
如果我不能使用我的模型,如何将数据从我的数据库传递到要呈现的页面?
任何帮助提示或技巧将不胜感激。
问候 马蒂
ViewComponent 与 razor 页面不同。
您应该直接在视图组件 class 中注入服务。喜欢:
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());
}
}