Return the result of View Component as string variable in a c# service












0















I am a bit new to .NET core, i currently have a service which generates email messages and return as a string, however i have a view component in which i usually call in my views and append the result with an already present string:



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>");


how can i call this view component in my service and pass the result into a string in which i can use in my email message service










share|improve this question



























    0















    I am a bit new to .NET core, i currently have a service which generates email messages and return as a string, however i have a view component in which i usually call in my views and append the result with an already present string:



    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>");


    how can i call this view component in my service and pass the result into a string in which i can use in my email message service










    share|improve this question

























      0












      0








      0








      I am a bit new to .NET core, i currently have a service which generates email messages and return as a string, however i have a view component in which i usually call in my views and append the result with an already present string:



      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>");


      how can i call this view component in my service and pass the result into a string in which i can use in my email message service










      share|improve this question














      I am a bit new to .NET core, i currently have a service which generates email messages and return as a string, however i have a view component in which i usually call in my views and append the result with an already present string:



      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>");


      how can i call this view component in my service and pass the result into a string in which i can use in my email message service







      c# asp.net-core asp.net-core-viewcomponent






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 23 '18 at 9:22









      Tobi OwolawiTobi Owolawi

      1101111




      1101111
























          1 Answer
          1






          active

          oldest

          votes


















          0














          i was able to implement this by creating a partial view for the view component:



          in the partial view, i declared my view component:



          @model int

          @await Component.InvokeAsync("Widget", new { widgetZone = "stock_levels_summary_cart_price", additionalData = Model})


          in my controller created an action as follows:



          public virtual PartialViewResult OrderDetailsStocklevel(int productId)
          {

          return PartialView("~/Views/Shared/_OrderDetailsStocklevel.cshtml", productId);
          }


          then implemented a service to render the partial view content and return the result:



                      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();
          }



          }
          }
          }


          then to load the partial view that was created from a view component, execute the method as follows:



                       var stockLevelLabel = _viewRenderService.RenderToString("stocklevel", orderItem.ProductId, "_OrderDetailsStocklevel");





          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53443780%2freturn-the-result-of-view-component-as-string-variable-in-a-c-sharp-service%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            i was able to implement this by creating a partial view for the view component:



            in the partial view, i declared my view component:



            @model int

            @await Component.InvokeAsync("Widget", new { widgetZone = "stock_levels_summary_cart_price", additionalData = Model})


            in my controller created an action as follows:



            public virtual PartialViewResult OrderDetailsStocklevel(int productId)
            {

            return PartialView("~/Views/Shared/_OrderDetailsStocklevel.cshtml", productId);
            }


            then implemented a service to render the partial view content and return the result:



                        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();
            }



            }
            }
            }


            then to load the partial view that was created from a view component, execute the method as follows:



                         var stockLevelLabel = _viewRenderService.RenderToString("stocklevel", orderItem.ProductId, "_OrderDetailsStocklevel");





            share|improve this answer




























              0














              i was able to implement this by creating a partial view for the view component:



              in the partial view, i declared my view component:



              @model int

              @await Component.InvokeAsync("Widget", new { widgetZone = "stock_levels_summary_cart_price", additionalData = Model})


              in my controller created an action as follows:



              public virtual PartialViewResult OrderDetailsStocklevel(int productId)
              {

              return PartialView("~/Views/Shared/_OrderDetailsStocklevel.cshtml", productId);
              }


              then implemented a service to render the partial view content and return the result:



                          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();
              }



              }
              }
              }


              then to load the partial view that was created from a view component, execute the method as follows:



                           var stockLevelLabel = _viewRenderService.RenderToString("stocklevel", orderItem.ProductId, "_OrderDetailsStocklevel");





              share|improve this answer


























                0












                0








                0







                i was able to implement this by creating a partial view for the view component:



                in the partial view, i declared my view component:



                @model int

                @await Component.InvokeAsync("Widget", new { widgetZone = "stock_levels_summary_cart_price", additionalData = Model})


                in my controller created an action as follows:



                public virtual PartialViewResult OrderDetailsStocklevel(int productId)
                {

                return PartialView("~/Views/Shared/_OrderDetailsStocklevel.cshtml", productId);
                }


                then implemented a service to render the partial view content and return the result:



                            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();
                }



                }
                }
                }


                then to load the partial view that was created from a view component, execute the method as follows:



                             var stockLevelLabel = _viewRenderService.RenderToString("stocklevel", orderItem.ProductId, "_OrderDetailsStocklevel");





                share|improve this answer













                i was able to implement this by creating a partial view for the view component:



                in the partial view, i declared my view component:



                @model int

                @await Component.InvokeAsync("Widget", new { widgetZone = "stock_levels_summary_cart_price", additionalData = Model})


                in my controller created an action as follows:



                public virtual PartialViewResult OrderDetailsStocklevel(int productId)
                {

                return PartialView("~/Views/Shared/_OrderDetailsStocklevel.cshtml", productId);
                }


                then implemented a service to render the partial view content and return the result:



                            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();
                }



                }
                }
                }


                then to load the partial view that was created from a view component, execute the method as follows:



                             var stockLevelLabel = _viewRenderService.RenderToString("stocklevel", orderItem.ProductId, "_OrderDetailsStocklevel");






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 23 '18 at 14:20









                Tobi OwolawiTobi Owolawi

                1101111




                1101111
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53443780%2freturn-the-result-of-view-component-as-string-variable-in-a-c-sharp-service%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Create new schema in PostgreSQL using DBeaver

                    Deepest pit of an array with Javascript: test on Codility

                    Costa Masnaga