Возврат результата просмотра компонента в виде строковой переменной в сервисе ac # - PullRequest
0 голосов
/ 23 ноября 2018

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

string result = @await Component.InvokeAsync("Widget", new { widgetZone = "stock_levels_summary_cart_price", additionalData = product.Id })
sb.AppendLine($"<td style=\"padding: 0.6em 0.4em;text-align: center;\">{result}</td>");

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

1 Ответ

0 голосов
/ 23 ноября 2018

Я смог реализовать это, создав частичное представление для компонента представления:

в частичном представлении, я объявил свой компонент представления:

@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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...