Как передать модель с данными из БД в обработчик макета ABP.IO?

пытается настроить мультитенантный сайт с помощью ABP.io framework 3.1.

Я пытаюсь установить ‹мета-ключевые слова (среди других тегов) в заголовке html страницы. Я пытаюсь получить значения из поля базы данных для текущего клиента, поэтому мета-ключевые слова будут специфичными для этого клиента. Я попытался следовать образцу, который доступен здесь: https://docs.abp.io/en/abp/latest/UI/AspNetCore/Customization-User-Interface#layout-hooks, где они вставляют код сценария Google Analytics в тег заголовка.

это нормально, так как это статический текст, но когда я пытаюсь загрузить частичную страницу с моделью, выдается ошибка ожидания другой модели по сравнению с той, которая была передана.

Пока у меня есть компонент просмотра уведомлений

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'.
 

Как передать данные из моей базы данных на страницу для отображения, если я не могу использовать свою модель?

Приветствуются любые подсказки и подсказки.

С уважением, Мэтти


abp
person Matty_C    schedule 10.09.2020    source источник


Ответы (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/Themes/PageAlerts/PageAlertsViewComponent.cs

person liangshiwei    schedule 10.09.2020
comment
Отлично, я знал, что это будет что-то простое и глупое, что я упустил. - person Matty_C; 11.09.2020