C# 在C中以字符串形式返回视图组件的结果#

C# 在C中以字符串形式返回视图组件的结果#,c#,asp.net-core,asp.net-core-viewcomponent,C#,Asp.net Core,Asp.net Core Viewcomponent,我有一个生成电子邮件并返回字符串的服务。但是,我有一个视图组件,我通常从视图中调用该组件,并将结果附加到一个已经存在的字符串中: string result=@wait Component.InvokeAsync(“Widget”,new{widgetZone=“stock\u levels\u summary\u cart\u price”,additionalData=product.Id}) sb.AppendLine($“{result}”); 如何在我的服务中调用此视图组件并将结果传

我有一个生成电子邮件并返回字符串的服务。但是,我有一个视图组件,我通常从视图中调用该组件,并将结果附加到一个已经存在的字符串中:

string result=@wait Component.InvokeAsync(“Widget”,new{widgetZone=“stock\u levels\u summary\u cart\u price”,additionalData=product.Id})
sb.AppendLine($“{result}”);

如何在我的服务中调用此视图组件并将结果传递到字符串变量中,以便在电子邮件服务中使用?

我可以通过为视图组件创建部分视图来实现这一点

在部分视图中,我声明了我的视图组件:

@model int

@await Component.InvokeAsync("Widget", new { widgetZone = "stock_levels_summary_cart_price", additionalData = Model})
在我的控制器中,我创建了如下操作:

public虚拟PartialViewResult OrderDetailsStocklevel(int-productId)
{
返回PartialView(“~/Views/Shared/_OrderDetailsStocklevel.cshtml”,productId);
}
然后我实现了一个服务来呈现部分视图内容并返回结果:

使用系统;
使用System.IO;
使用System.Threading.Tasks;
使用Microsoft.AspNetCore.Http;
使用Microsoft.AspNetCore.Mvc;
使用Microsoft.AspNetCore.Mvc.Abstractions;
使用Microsoft.AspNetCore.Mvc.ModelBinding;
使用Microsoft.AspNetCore.Mvc.Razor;
使用Microsoft.AspNetCore.Mvc.Rendering;
使用Microsoft.AspNetCore.Mvc.ViewFeatures;
使用Microsoft.AspNetCore.Routing;
命名空间Nop.Services.Helpers
{
公共接口IViewRenderHelper
{
string RenderToString(字符串视图名称、对象模型、字符串视图路径);
}
公共类ViewRenderHelper:IViewRenderHelper
{
私有只读服务器ViceProvider\u服务提供商;
公共ViewRenderHelper(IServiceProvider服务提供商)
{
_服务提供者=服务提供者;
}
公共字符串RenderToString(字符串视图名称、对象模型、字符串视图路径)
{
var httpContext=newdefaulthttpcontext{RequestServices=\u serviceProvider};
var actionContext=new actionContext(httpContext,new RouteData(),new ActionDescriptor());
var engine=_serviceProvider.GetService(typeof(IRazorViewEngine))作为IRazorViewEngine;
var tempDataProvider=_serviceProvider.GetService(typeof(ITempDataProvider))作为ITempDataProvider;
如果(引擎==null)
{
抛出新异常(“找不到IRazorViewEngine”);
}
var viewEngineResult=engine.FindView(actionContext,viewPath,false);
如果(!viewEngineResult.Success)
{
抛出新的InvalidOperationException($“找不到视图“{viewName}”);
}
var viewDictionary=new ViewDataDictionary(new EmptyModelMetadataProvider(),new ModelStateDictionary())
{
模型
};
使用(var输出=新的StringWriter())
{
var viewContext=newviewcontext(actionContext、viewEngineResult.View、,
viewDictionary,新的TempDataDictionary(actionContext.HttpContext,tempDataProvider),
输出,新的HtmlHelpOptions());
viewEngineResult.View.RenderAsync(viewContext.GetWaiter().GetResult();
返回output.ToString();
}
}
}
}
然后,为了加载从视图组件创建的局部视图,我执行了如下方法:

var stockLevelLabel=\u viewRenderService.renderString(“stocklevel”,orderItem.ProductId,”\u OrderDetailsStocklevel”);