在使用ASP.NET Core的Razor视图引擎时,如果你想要从视图中提取并返回纯HTML内容,可以通过以下几种方法实现:
View()
方法在你的控制器中,你可以直接调用View()
方法来渲染视图,并获取渲染后的HTML内容。
public IActionResult GetHtmlContent()
{
var result = View("YourViewName").Result;
var htmlContent = ((ViewResult)result).View.Render(result.ViewData, result.TempDataProvider, result.Writer);
return Content(htmlContent.ToString(), "text/html");
}
RazorViewEngine
你可以使用RazorViewEngine
来编译和渲染视图,从而获取HTML内容。
public IActionResult GetHtmlContent()
{
var viewEngine = new RazorViewEngine();
var viewPath = "~/Views/YourControllerName/YourViewName.cshtml";
var view = viewEngine.FindView(ControllerContext, viewPath, false);
if (view.View == null)
{
throw new ArgumentNullException($"{viewPath} does not match any available view");
}
var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary());
var viewContext = new ViewContext(ControllerContext, view.View, viewDictionary, new TempDataDictionary(), TextWriter.Null, new HtmlHelperOptions());
using (var output = new StringWriter())
{
view.View.Render(viewContext, output);
var htmlContent = output.ToString();
return Content(htmlContent, "text/html");
}
}
IViewRenderService
你可以创建一个服务来处理视图的渲染,这样可以更好地解耦和控制。
首先,定义一个接口:
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
中注册这个服务:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddScoped<IViewRenderService, ViewRenderService>();
}
最后,在控制器中使用这个服务:
public class YourController : Controller
{
private readonly IViewRenderService _viewRenderService;
public YourController(IViewRenderService viewRenderService)
{
_viewRenderService = viewRenderService;
}
public async Task<IActionResult> GetHtmlContent()
{
var htmlContent = await _viewRenderService.RenderToStringAsync("YourViewName", new YourModel());
return Content(htmlContent, "text/html");
}
}
这种方法通常用于以下场景:
通过上述方法,你可以有效地从Razor视图中提取并返回纯HTML内容。
领取专属 10元无门槛券
手把手带您无忧上云