我找到了一些文章,介绍如何在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。
using ..
"dependencies": { "Microsoft.AspNetCore.Mvc": "1.1.0", ... },
project.json
其他一些示例代码在此处,此处和此处
注意 我需要一种解决方案来将视图转换为string.NET Core,无论转换了相同的代码还是其他可以转换的代码。
string
感谢Paris Polyzos及其文章。
我在这里重新发布他的代码,以防万一原始帖子因任何原因被删除。
Service在文件中创建viewToString.cs如下代码:
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(); } } } }
2. 将服务添加到Startup.cs文件中,如下所示:
Startup.cs
using WebApplication.Services; public void ConfigureServices(IServiceCollection services) { ... services.AddScoped<IViewRenderService, ViewRenderService>(); }
3. 添加"preserveCompilationContext": true到buildOptions中的project.json,因此文件如下所示:
"preserveCompilationContext": true
buildOptions
{ "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" } } }
4. 定义您model,例如:
model
public class InviteViewModel { public string UserId {get; set;} public string UserName {get; set;} public string ReferralCode {get; set;} public int Credits {get; set;} }
5. 创建您Invite.cshtml的示例:
Invite.cshtml
@{ ViewData["Title"] = "Contact"; } @ViewData["Title"]. user id: @Model.UserId
6. 在Controller:
Controller
一个。 首先定义以下内容:
private readonly IViewRenderService _viewRenderService; public RenderController(IViewRenderService viewRenderService) { _viewRenderService = viewRenderService; }
b。 调用并返回带有模型的视图,如下所示:
var result = await _viewRenderService.RenderToStringAsync("Email/Invite", viewModel); return Content(result);
C。 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;} } }