在 html 字符串中渲染 ViewComponent
Render ViewComponent inside html string
假设我有一个名为 MyComponent 的 ViewComponent。
从 ASP.NET Core 1.1 开始,我可以通过在 razor view .cs 中编写这个来呈现这个 ViewComponenthtml 页面:
<vc:my-component></vc:my-component>
我想做这样的事情:
@{string myHtml = "<vc:my-component></vc:my-component>";}
@(new HtmlString(myHtml))
我通过这样做安装并尝试了 RazorEngine,但这没有用:
string template = "<vc:my-component></vc:my-component>";
var result = Engine.Razor.RunCompile(template, "messageTemplateKey", null, new { Name = "some model data" });
ViewBag.result = result;
然后在.chtml文件中:
@(new HtmlString(ViewBag.result))
背景故事是我创建了一个 ViewComponent,其中包含一些关于如何处理图像文件的逻辑,现在我想搜索并用我的 ViewComponent 替换某些 html 中的所有 img 标签。在我这样做之前,我需要确保它能正常工作。
这就是我最后做的事情:
我将 MyComponent 的视图代码从 Default.cshtml 移动到局部视图 (_myPartial)。
然后我使用了受 this post.
启发的 IViewRenderService
然后我可以在传入视图模型后渲染并获取我的 html 字符串:
var result = ViewRenderService.RenderToString("_myPartial", viewModel);
在 github 上检查此 url 处的代码:
https://gist.github.com/pauldotknopf/b424e9b8b03d31d67f3cce59f09ab17f
代码
public class HomeController : Controller {
public async Task<string> RenderViewComponent(string viewComponent, object args) {
var sp = HttpContext.RequestServices;
var helper = new DefaultViewComponentHelper(
sp.GetRequiredService<IViewComponentDescriptorCollectionProvider>(),
HtmlEncoder.Default,
sp.GetRequiredService<IViewComponentSelector>(),
sp.GetRequiredService<IViewComponentInvokerFactory>(),
sp.GetRequiredService<IViewBufferScope>());
using (var writer = new StringWriter()) {
var context = new ViewContext(ControllerContext, NullView.Instance, ViewData, TempData, writer, new HtmlHelperOptions());
helper.Contextualize(context);
var result = await helper.InvokeAsync(viewComponent, args);
result.WriteTo(writer, HtmlEncoder.Default);
await writer.FlushAsync();
return writer.ToString();
}
}}
假设我有一个名为 MyComponent 的 ViewComponent。
从 ASP.NET Core 1.1 开始,我可以通过在 razor view .cs 中编写这个来呈现这个 ViewComponenthtml 页面:
<vc:my-component></vc:my-component>
我想做这样的事情:
@{string myHtml = "<vc:my-component></vc:my-component>";}
@(new HtmlString(myHtml))
我通过这样做安装并尝试了 RazorEngine,但这没有用:
string template = "<vc:my-component></vc:my-component>";
var result = Engine.Razor.RunCompile(template, "messageTemplateKey", null, new { Name = "some model data" });
ViewBag.result = result;
然后在.chtml文件中:
@(new HtmlString(ViewBag.result))
背景故事是我创建了一个 ViewComponent,其中包含一些关于如何处理图像文件的逻辑,现在我想搜索并用我的 ViewComponent 替换某些 html 中的所有 img 标签。在我这样做之前,我需要确保它能正常工作。
这就是我最后做的事情:
我将 MyComponent 的视图代码从 Default.cshtml 移动到局部视图 (_myPartial)。 然后我使用了受 this post.
启发的 IViewRenderService然后我可以在传入视图模型后渲染并获取我的 html 字符串:
var result = ViewRenderService.RenderToString("_myPartial", viewModel);
在 github 上检查此 url 处的代码:
https://gist.github.com/pauldotknopf/b424e9b8b03d31d67f3cce59f09ab17f
代码
public class HomeController : Controller {
public async Task<string> RenderViewComponent(string viewComponent, object args) {
var sp = HttpContext.RequestServices;
var helper = new DefaultViewComponentHelper(
sp.GetRequiredService<IViewComponentDescriptorCollectionProvider>(),
HtmlEncoder.Default,
sp.GetRequiredService<IViewComponentSelector>(),
sp.GetRequiredService<IViewComponentInvokerFactory>(),
sp.GetRequiredService<IViewBufferScope>());
using (var writer = new StringWriter()) {
var context = new ViewContext(ControllerContext, NullView.Instance, ViewData, TempData, writer, new HtmlHelperOptions());
helper.Contextualize(context);
var result = await helper.InvokeAsync(viewComponent, args);
result.WriteTo(writer, HtmlEncoder.Default);
await writer.FlushAsync();
return writer.ToString();
}
}}