c# - 将部分视图转换为 HTML 2019
问题描述
已经在这几个星期了。一些简单的事情无缘无故变得非常困难。我要做的就是返回部分视图的 HTML。为什么?
在 Azure 中的一页上呈现多个局部视图非常慢。它会导致 502 错误,并且您无法更改超时(感谢 Microsoft)。
一切都在我本地的开发中运行,移动到 Azure,而这主要的事情不起作用。我已经尝试了所有找到的示例。
问题是代码和方法似乎随着框架而改变。没有什么比 2018 年更新的了。所以要么没有人得到这项工作,要么部分观点基本上没用。这是我来过的最接近的,但 RazorViewEngine 不想解决。
private async Task<string> RenderPartialViewToString(string viewName, object model)
{
RazorViewEngine _viewEngine = new RazorViewEngine();
if (string.IsNullOrEmpty(viewName))
viewName = ControllerContext.ActionDescriptor.ActionName;
ViewData.Model = model;
using (var writer = new StringWriter())
{
ViewEngineResult viewResult = _viewEngine.FindView(ControllerContext, viewName, false);
ViewContext viewContext = new ViewContext(
ControllerContext,
viewResult.View,
ViewData,
TempData,
writer,
new HtmlHelperOptions()
);
await viewResult.View.RenderAsync(viewContext);
return writer.GetStringBuilder().ToString();
}
}
解决方案
我做了这门课:
public class ViewRenderService
{
private readonly IRazorViewEngine _razorViewEngine;
private readonly ITempDataProvider _tempDataProvider;
private readonly HttpContext _http;
public ViewRenderService(IRazorViewEngine razorViewEngine, ITempDataProvider tempDataProvider, IServiceProvider serviceProvider, IHttpContextAccessor ctx)
{
_razorViewEngine = razorViewEngine;
_tempDataProvider = tempDataProvider;
_http = ctx.HttpContext;
_http.RequestServices = serviceProvider;
}
public async Task<string> RenderToStringAsync(RouteData routeData, string viewName, object model)
{
var actionContext = new ActionContext(_http, routeData, new ActionDescriptor());
using (var sw = new StringWriter())
{
var viewResult = _razorViewEngine.FindView(actionContext, 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();
}
}
}
您可以将其添加IServiceCollection
为Scoped
.
推荐阅读
- shell - 如何从 Github 下载带有 Unix 格式的 Shell 脚本?
- kotlin - Kotlin 中的 java.net.http.HttpClient 暂停功能:未解决的参考:等待
- python - 如何根据数据框中的先前值创建列
- javascript - 有没有办法在 html 中显示情绪面孔?
- bash - Linux sed 命令在每个正则表达式匹配时生成一个新文件
- python - 使用 TPU pod 训练 keras 模型?
- c# - 为什么我在尝试调试时偶尔会遇到断点未命中的问题?
- javascript - 文件未另存为 .png
- android - 位图返回为空
- vba - Powerpoint VBA 选择图像文件夹,将这些图像放在幻灯片上