c# - .NET Core 2.1 - 从 ControllerA.Action 执行 ControllerB.Action 返回一个字符串
问题描述
我有一个生成电子邮件的系统。这些电子邮件的部分内容来自 ParialViews。在我的 EmailController 中,我希望能够通过调用相关操作并插入 View HTML 来获取构成电子邮件模板区域的 HTML 片段。
我在这里看到了关于它的帖子(Return View as String in .NET Core),但它并不完全有效......
下面的解决方案确实找到并尝试获取 View HTML ,但它实际上并没有尝试执行 View 的控制器操作。由于视图是动态的,这会导致错误。
那么,我可以从内部执行 ControllerB.Action
将其结果重新作为字符串ControllerA.Action
吗?
我目前的尝试: 服务:
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();
}
}
}
启动.cs
services.AddScoped<IViewRenderService, ViewRenderService>();
控制器 A
private readonly IViewRenderService _viewRenderService;
public ReportController(...
IViewRenderService viewRenderService)
{
...
_viewRenderService = viewRenderService;
}
来自控制器 A 的调用:
var theHtmlString = await _viewRenderService.RenderToStringAsync("ControllerB/Action1", new { parameters = paramsmodel });
解决方案
推荐阅读
- vue.js - 关闭所有下拉菜单 $root 事件
- php - PHP URL 重写 - .htaccess & MAMP
- cmd - 运行“make”命令以运行暗网时出错
- javascript - React Native:setState(...):接受状态变量对象进行更新或返回状态变量对象的函数
- java - 解决 org.springframework.data.mapping.PropertyReferenceException: No property getOne found for type MyLog
- security - 如何使用 ColdFusion 的 IIS URL 重写从 Header Response 中删除服务器标头和其他变量?对于 IIS(8 及以上版本)
- java - 由于找不到`HttpServletRequest`类,@EnableZuulProxy 不起作用
- javascript - 我们如何从赛普拉斯测试中调用在单独文件中编写的函数?
- python - GTKAgg 画布和 GTKScrolledWindow 上的滚动事件
- c# - JsonConvert.DeserializeObject 函数在解析过时的枚举属性时抛出错误