From eb76a9e4825925c017458483c902df5bce21f149 Mon Sep 17 00:00:00 2001 From: Salih Date: Sat, 29 Jul 2023 17:02:25 +0300 Subject: [PATCH] Fix dynamic Widget Parameter Cast Problem --- .../Contents/ContentFragment.cshtml | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentFragment.cshtml b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentFragment.cshtml index 0fa7d59064..1fe1d67791 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentFragment.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentFragment.cshtml @@ -1,11 +1,13 @@ -@using System.Dynamic +@using Microsoft.AspNetCore.Mvc.ViewComponents @using Volo.Abp.Data +@using Volo.Abp.Reflection @using Volo.CmsKit.Web.Renderers; @using Volo.CmsKit.Web.Pages.CmsKit.Components.Contents; @model ContentFragmentViewComponent @inject IMarkdownToHtmlRenderer MarkdownRenderer +@inject IViewComponentSelector ViewComponentSelector @foreach (var contentFragment in Model.ContentDto.ContentFragments) { @@ -15,6 +17,23 @@ } else if (contentFragment.Type == "Widget") { - @await Component.InvokeAsync(contentFragment.GetProperty("Type"), contentFragment.ExtraProperties.ConvertToDynamicObject()) + var componentName = contentFragment.GetProperty("Type"); + var descriptor = ViewComponentSelector.SelectComponent(componentName); + var componentParameters = descriptor.Parameters; + var parameters = new Dictionary(contentFragment.ExtraProperties); + + foreach (var componentParameter in componentParameters) + { + if (string.IsNullOrWhiteSpace(componentParameter.Name)) + { + continue; + } + if(parameters.TryGetValue(componentParameter.Name, out var value)) + { + parameters[componentParameter.Name] = TypeHelper.ConvertFrom(componentParameter.ParameterType, value); + } + } + + @await Component.InvokeAsync(componentName, parameters) } } \ No newline at end of file