c# .NET কোর স্ট্রিং হিসাবে দেখুন




asp.net razor (6)

আমি এএসপি.এনইটি-তে স্ট্রিংয়ে কীভাবে ভিউ ফিরিয়ে আনতে পারি সে সম্পর্কে আমি কিছু নিবন্ধ পেয়েছি, তবে নেট নেট দিয়ে এটি চালাতে সক্ষম হওয়ার জন্য কোনওটি গুপ্ত করতে পারেনি could

public static string RenderViewToString(this Controller controller, string viewName, object model)
{
    var context = controller.ControllerContext;
    if (string.IsNullOrEmpty(viewName))
        viewName = context.RouteData.GetRequiredString("action");

    var viewData = new ViewDataDictionary(model);

    using (var sw = new StringWriter())
    {
        var viewResult = ViewEngines.Engines.FindPartialView(context, viewName);
        var viewContext = new ViewContext(context, viewResult.View, viewData, new TempDataDictionary(), sw);
        viewResult.View.Render(viewContext, sw);

        return sw.GetStringBuilder().ToString();
    }
}

যা ব্যবহার করে কোনও নিয়ামকের কাছ থেকে কল করতে সক্ষম হবে বলে ধরে নেওয়া হয়েছে:

var strView = this.RenderViewToString("YourViewName", yourModel);

আমি যখন উপরের নেট নেট তে চালানোর চেষ্টা করি তখন প্রচুর সংকলন ত্রুটি পাই।

আমি এটি নেট কোর দিয়ে কাজ করে রূপান্তরিত করার চেষ্টা করেছি, কিন্তু ব্যর্থ হয়েছে, কেউ প্রয়োজনীয় এবং using .. "dependencies": { "Microsoft.AspNetCore.Mvc": "1.1.0", ... }, প্রয়োজনীয়তা "dependencies": { "Microsoft.AspNetCore.Mvc": "1.1.0", ... }, এবং, project.json ব্যবহৃত হবে।

কিছু অন্যান্য নমুনা কোড here এবং here এবং here

দ্রষ্টব্য দ্রষ্টব্যটিকে .NET কোর এ string রূপান্তরিত করার জন্য আমার সমাধান দরকার, নির্বিশেষে একই কোড রূপান্তরিত হয়ে গেছে বা এটি করতে পারে এমন অন্য কোনও উপায়।


নীচের লিঙ্কটি একই সমস্যাটিকে খুব সুন্দরভাবে মোকাবেলা করেছে:

এমভিসি 6 কন্ট্রোলারে কন্ট্রোলার কনটেক্সট এবং ভিউএঞ্জাইন বৈশিষ্ট্যগুলি কোথায়?

হাসান এ ইউসুফের উত্তরে আমাকে কাজ করতে আমার উপরের লিঙ্কে একই পরিবর্তন করতে হয়েছিল:

using Microsoft.AspNetCore.Hosting;
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;
using System;
using System.IO;
using System.Threading.Tasks;

public class ViewRenderService : IViewRenderService
{
    private readonly IRazorViewEngine _razorViewEngine;
    private readonly ITempDataProvider _tempDataProvider;
    private readonly IServiceProvider _serviceProvider;
    private readonly IHostingEnvironment _env;

    public ViewRenderService(IRazorViewEngine razorViewEngine, ITempDataProvider tempDataProvider, IServiceProvider serviceProvider, IHostingEnvironment env)
    {
        _razorViewEngine = razorViewEngine; _tempDataProvider = tempDataProvider; _serviceProvider = serviceProvider; _env = env;
    }

    public async Task<string> RenderToStringAsync(string viewName, object model)
    {
        var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider };
        var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());

        using (var sw = new StringWriter()) {
            //var viewResult = _razorViewEngine.FindView(actionContext, viewName, false);
            var viewResult = _razorViewEngine.GetView(_env.WebRootPath, viewName, false);
            if (viewResult.View == null) {
                throw new ArgumentNullException($"{viewName} does not match any available view");
            }
            var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary()) {
                Model = model
            };
            var viewContext = new ViewContext(actionContext, viewResult.View, viewDictionary, new TempDataDictionary(actionContext.HttpContext, _tempDataProvider), sw, new HtmlHelperOptions());
            await viewResult.View.RenderAsync(viewContext);
            return sw.ToString();
        }
    }

যদি আমার মতো আপনার কাছে এমন বেশ কয়েকটি নিয়ামক রয়েছে যার একটি রিপোর্টিং সাইটের মতো এটি প্রয়োজন তবে এই কোডটি পুনরাবৃত্তি করা সত্যিই আদর্শ নয় এবং এমনকি অন্য কোনও পরিষেবাতে ইনজেকশন দেওয়া বা কল করা সত্য বলে মনে হয় না।

সুতরাং আমি নিম্নলিখিত পার্থক্য সহ উপরের নিজস্ব সংস্করণ তৈরি করেছি:

  • মডেল দৃ strong় টাইপিং
  • ভিউ সন্ধান করার সময় ত্রুটি পরীক্ষা করা
  • পার্টিয়াল বা পৃষ্ঠাগুলি হিসাবে দর্শন সরবরাহ করার ক্ষমতা
  • asynchronus
  • একটি নিয়ামক এক্সটেনশন হিসাবে বাস্তবায়িত
  • কোনও ডিআইয়ের দরকার নেই

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.Rendering;
    using Microsoft.AspNetCore.Mvc.ViewEngines;
    using Microsoft.AspNetCore.Mvc.ViewFeatures;
    using System.IO;
    using System.Threading.Tasks;
    
    namespace CC.Web.Helpers
    {
        public static class ControllerExtensions
        {
            public static async Task<string> RenderViewAsync<TModel>(this Controller controller, string viewName, TModel model, bool partial = false)
            {
                if (string.IsNullOrEmpty(viewName))
                {
                    viewName = controller.ControllerContext.ActionDescriptor.ActionName;
                }
    
                controller.ViewData.Model = model;
    
                using (var writer = new StringWriter())
                {
                    IViewEngine viewEngine = controller.HttpContext.RequestServices.GetService(typeof(ICompositeViewEngine)) as ICompositeViewEngine;
                    ViewEngineResult viewResult = viewEngine.FindView(controller.ControllerContext, viewName, !partial);
    
                    if (viewResult.Success == false)
                    {
                        return $"A view with the name {viewName} could not be found";
                    }
    
                    ViewContext viewContext = new ViewContext(
                        controller.ControllerContext,
                        viewResult.View,
                        controller.ViewData,
                        controller.TempData,
                        writer,
                        new HtmlHelperOptions()
                    );
    
                    await viewResult.View.RenderAsync(viewContext);
    
                    return writer.GetStringBuilder().ToString();
                }
            }
        }
    }

তারপরে কেবল এর সাথে বাস্তবায়ন করুন:

viewHtml = await this.RenderViewAsync("Report", model);

বা এটি একটি আংশিক দর্শনের জন্য:

partialViewHtml = await this.RenderViewAsync("Report", model, true);

আমি সমাধানটি চেষ্টা করেছি যা ডটনেট কোর ২.১-এ @ হাসান এ ইউসুফের উত্তর দিয়েছিল, তবে সিএসটিএইচএমএল আমার পক্ষে ভাল কাজ করে না। এটি সর্বদা একটি নালরফেরান এক্সেপশন ছুড়ে দেয়, স্ক্রিনশটটি দেখুন।

এটির সমাধানের জন্য, আমি একটি নতুন অবজেক্টে এইচটিএমএল.ভিউ ডেটা.মোডেল বরাদ্দ করি। এখানে আমার কোড।

@page
@model InviteViewModel 
@{
    var inviteViewModel = Html.ViewData.Model;
}

<p>
    <strong>User Id:</strong> <code>@inviteViewModel.UserId </code>
</p>

মাইক্রোসফ্টের https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/testing এ নিয়ন্ত্রক পরীক্ষার বিষয়ে একটি দুর্দান্ত নিবন্ধ রয়েছে

একবার আপনি কোনও ভিউর রিসাল্ট ফিরে আসার পরে আপনি স্ট্রিং সামগ্রীটি পেতে পারেন

var strResult = ভিউআরসাল্ট.সন্টেন্ট


উপরের উত্তরগুলি ঠিক আছে, তবে কোনও ট্যাগ হেল্পারকে কাজ করতে পেতে টুইট করতে হবে (আমাদের আসলে HTTP প্রসঙ্গটি ব্যবহার করা দরকার)। এছাড়াও একটি লেআউট রেন্ডার করার জন্য আপনাকে ভিউটিতে স্পষ্টভাবে লেআউট সেট করতে হবে।

public class ViewRenderService : IViewRenderService
{
    private readonly IRazorViewEngine _razorViewEngine;
    private readonly ITempDataProvider _tempDataProvider;
    private readonly IServiceProvider _serviceProvider;
    private readonly IHostingEnvironment _env;
    private readonly HttpContext _http;

    public ViewRenderService(IRazorViewEngine razorViewEngine, ITempDataProvider tempDataProvider, IServiceProvider serviceProvider, IHostingEnvironment env, IHttpContextAccessor ctx)
    {
        _razorViewEngine = razorViewEngine; _tempDataProvider = tempDataProvider; _serviceProvider = serviceProvider; _env = env; _http = ctx.HttpContext;
    }

    public async Task<string> RenderToStringAsync(string viewName, object model)
    {
        var actionContext = new ActionContext(_http, new RouteData(), new ActionDescriptor());

        using (var sw = new StringWriter())
        {
            var viewResult = _razorViewEngine.FindView(actionContext, viewName, false);
            //var viewResult = _razorViewEngine.GetView(_env.WebRootPath, viewName, false); // For views outside the usual Views folder
            if (viewResult.View == null)
            {
                throw new ArgumentNullException($"{viewName} does not match any available view");
            }
            var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
            {
                Model = model
            };
            var viewContext = new ViewContext(actionContext, viewResult.View, viewDictionary, new TempDataDictionary(_http, _tempDataProvider), sw, new HtmlHelperOptions());
            viewContext.RouteData = _http.GetRouteData();
            await viewResult.View.RenderAsync(viewContext);
            return sw.ToString();
        }
    }
}

প্যারিস পলিজোস এবং তার article ধন্যবাদ।

আমি এখানে তার কোডটি আবার পোস্ট করছি, যদি কোনও কারণে মূল পোস্টটি সরানো হয় তবেই।

নীচের কোড হিসাবে ফাইল viewToString.cs Service তৈরি করুন:

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 WebApplication.Services
{
    public interface IViewRenderService
    {
        Task<string> RenderToStringAsync(string viewName, object model);
    }
 
    public class ViewRenderService : IViewRenderService
    {
        private readonly IRazorViewEngine _razorViewEngine;
        private readonly ITempDataProvider _tempDataProvider;
        private readonly IServiceProvider _serviceProvider;
 
        public ViewRenderService(IRazorViewEngine razorViewEngine,
            ITempDataProvider tempDataProvider,
            IServiceProvider serviceProvider)
        {
            _razorViewEngine = razorViewEngine;
            _tempDataProvider = tempDataProvider;
            _serviceProvider = serviceProvider;
        }
 
        public async Task<string> RenderToStringAsync(string viewName, object model)
        {
            var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider };
            var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
 
            using (var sw = new StringWriter())
            {
                var viewResult = _razorViewEngine.FindView(actionContext, viewName, false);
 
                if (viewResult.View == null)
                {
                    throw new ArgumentNullException($"{viewName} does not match any available view");
                }
 
                var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
                {
                    Model = model
                };
 
                var viewContext = new ViewContext(
                    actionContext,
                    viewResult.View,
                    viewDictionary,
                    new TempDataDictionary(actionContext.HttpContext, _tempDataProvider),
                    sw,
                    new HtmlHelperOptions()
                );
 
                await viewResult.View.RenderAsync(viewContext);
                return sw.ToString();
            }
        }
    }
}
  1. Startup.cs ফাইলগুলিতে পরিষেবা যুক্ত করুন:

    using WebApplication.Services;
    
    public void ConfigureServices(IServiceCollection services)
    {
        ...
        services.AddScoped<IViewRenderService, ViewRenderService>();
     }

"preserveCompilationContext": true buildOptions "preserveCompilationContext": true project.json buildOptions "preserveCompilationContext": true , তাই ফাইলটি দেখে মনে হচ্ছে:

{
  "version": "1.0.0-*",
  "buildOptions": {
    "debugType": "portable",
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },
  "dependencies": {
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.1",
    "Microsoft.AspNetCore.Mvc": "1.0.1"
  },
  "frameworks": {
    "netcoreapp1.0": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.0.1"
        }
      },
      "imports": "dnxcore50"
    }
  }
}
  1. আপনার model সংজ্ঞায়িত করুন, উদাহরণস্বরূপ:

    public class InviteViewModel {
        public string   UserId {get; set;}
        public string   UserName {get; set;}
        public string   ReferralCode {get; set;}
        public int  Credits {get; set;}
    }
  2. উদাহরণস্বরূপ আপনার Invite.cshtml তৈরি করুন:

    @{
        ViewData["Title"] = "Contact";
    }
    @ViewData["Title"].
    user id: @Model.UserId
  3. Controller :

ক। শুরুতে নীচের সংজ্ঞা দিন:

private readonly IViewRenderService _viewRenderService;
 
public RenderController(IViewRenderService viewRenderService)
{
    _viewRenderService = viewRenderService;
}

B ইংরেজী বর্ণমালার দ্বিতীয় অক্ষর. নীচের মত মডেলটি দিয়ে কল করুন এবং দেখুন:

var result = await _viewRenderService.RenderToStringAsync("Email/Invite", viewModel);
return Content(result);

গ। সম্পূর্ণ নিয়ামক উদাহরণটি এর মতো হতে পারে:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

using WebApplication.Services;

namespace WebApplication.Controllers
{
[Route("render")]
public class RenderController : Controller
{
    private readonly IViewRenderService _viewRenderService;
 
    public RenderController(IViewRenderService viewRenderService)
    {
        _viewRenderService = viewRenderService;
    }
 
    [Route("invite")]
    public async Task<IActionResult> RenderInviteView()
    {
        ViewData["Message"] = "Your application description page.";
        var viewModel = new InviteViewModel
        {
            UserId = "cdb86aea-e3d6-4fdd-9b7f-55e12b710f78",
            UserName = "Hasan",
            ReferralCode = "55e12b710f78",
            Credits = 10
        };
 
        var result = await _viewRenderService.RenderToStringAsync("Email/Invite", viewModel);
        return Content(result);
    }
}

public class InviteViewModel {
        public string   UserId {get; set;}
        public string   UserName {get; set;}
        public string   ReferralCode {get; set;}
        public int  Credits {get; set;}
} 
}






.net-core