在.NET Core中以字符串形式返回视图

我找到了一些文章,介绍如何在ASP.NET中将视图返回到字符串,但是无法隐蔽任何内容以使其能够在.NET Core中运行

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

}

}

假定能够使用以下命令从Controller调用:

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

当我尝试将以上内容运行到.NET Core中时,出现很多编译错误。

我试图将其转换为与.NET的核心工作,但失败了,谁能帮助与提要求using ..和所需"dependencies": {

"Microsoft.AspNetCore.Mvc": "1.1.0", ... },的使用project.json

其他一些示例代码在此处,此处和此处

我需要一种解决方案来将视图转换为string.NET Core,无论转换了相同的代码还是其他可以转换的代码。

回答:

感谢Paris

Polyzos及其文章。

我在这里重新发布他的代码,以防万一原始帖子因任何原因被删除。

Service在文件中创建viewToString.cs如下代码:

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

            }

        }

    }

}

将服务添加到Startup.cs文件中,如下所示:

using WebApplication.Services;

public void ConfigureServices(IServiceCollection services)

{

...

services.AddScoped<IViewRenderService, ViewRenderService>();

}

添加"preserveCompilationContext":

truebuildOptions中的project.json,因此文件如下所示:

{

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

}

}

}

定义您model,例如:

public class InviteViewModel {

public string UserId {get; set;}

public string UserName {get; set;}

public string ReferralCode {get; set;}

public int Credits {get; set;}

}

创建您Invite.cshtml的示例:

@{

ViewData["Title"] = "Contact";

}

@ViewData["Title"].

user id: @Model.UserId

Controller

首先定义以下内容:

private readonly IViewRenderService _viewRenderService;

public RenderController(IViewRenderService viewRenderService)

{

_viewRenderService = viewRenderService;

}

调用并返回带有模型的视图,如下所示:

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

return Content(result);

FULL控制器的示例如下:

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中以字符串形式返回视图 的全部内容, 来源链接: utcz.com/qa/412434.html

回到顶部