Я смог реализовать это, создав частичное представление для компонента представления:
в частичном представлении, я объявил свой компонент представления:
@model int
@await Component.InvokeAsync("Widget", new { widgetZone = "stock_levels_summary_cart_price", additionalData = Model})
в моем контроллере создалДействуйте следующим образом:
public virtual PartialViewResult OrderDetailsStocklevel(int productId)
{
return PartialView("~/Views/Shared/_OrderDetailsStocklevel.cshtml", productId);
}
затем внедрили службу для визуализации содержимого частичного представления и возврата результата:
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Routing;
namespace Nop.Services.Helpers
{
public interface IViewRenderHelper
{
string RenderToString(string viewName, object model, string viewPath);
}
public class ViewRenderHelper : IViewRenderHelper
{
private readonly IServiceProvider _serviceProvider;
public ViewRenderHelper(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public string RenderToString(string viewName, object model, string viewPath)
{
var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider };
var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
var engine = _serviceProvider.GetService(typeof(IRazorViewEngine)) as IRazorViewEngine;
var tempDataProvider = _serviceProvider.GetService(typeof(ITempDataProvider)) as ITempDataProvider;
if (engine == null)
{
throw new Exception("Can't find IRazorViewEngine");
}
var viewEngineResult = engine.FindView(actionContext, viewPath, false);
if (!viewEngineResult.Success)
{
throw new InvalidOperationException($"Couldn't find view '{viewName}'");
}
var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
{
Model = model
};
using (var output = new StringWriter())
{
var viewContext = new ViewContext(actionContext, viewEngineResult.View,
viewDictionary, new TempDataDictionary(actionContext.HttpContext, tempDataProvider),
output, new HtmlHelperOptions());
viewEngineResult.View.RenderAsync(viewContext).GetAwaiter().GetResult();
return output.ToString();
}
}
}
}
затем для загрузки частичного представления, созданного из компонента представлениявыполните метод следующим образом:
var stockLevelLabel = _viewRenderService.RenderToString("stocklevel", orderItem.ProductId, "_OrderDetailsStocklevel");