【问题标题】:Render ViewComponent inside html string在 html 字符串中渲染 ViewComponent
【发布时间】:2017-04-05 08:25:58
【问题描述】:

假设我有一个名为 MyComponent 的 ViewComponent。

从 ASP.NET Core 1.1 开始,我可以通过在 razor 视图 .cshtml 页面中编写这个来呈现这个 ViewComponent:

 <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 标签。在我这样做之前,我需要确保它甚至可以工作。

【问题讨论】:

  • 由于存在在堆栈溢出时将视图渲染为字符串的示例,因此创建视图并将代码放入其中以使用您的视图组件然后将视图渲染到细绳?我很确定这对你有用。

标签: c# asp.net-mvc asp.net-core asp.net-core-viewcomponent


【解决方案1】:

在 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();
    }
  }}

【讨论】:

  • 虽然这在理论上可以回答这个问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
【解决方案2】:

这就是我最终做的:

我将视图代码从 MyComponent 的 Default.cshtml 移至局部视图 (_myPartial)。 然后我使用了受this post启发的IViewRenderService。

然后我可以通过执行以下操作在传入视图模型后渲染并获取我的 html 字符串:

 var result = ViewRenderService.RenderToString("_myPartial", viewModel);

【讨论】:

  • @TobiOwolawi 这个例子是一个视图组件。我只需将 html/razor 代码从视图组件 Default.cshtml 移动到局部视图。这样,我既可以使用视图组件,也可以使用下面的局部视图检索呈现的 html
猜你喜欢
  • 2011-07-26
  • 2016-11-13
  • 1970-01-01
  • 2014-08-29
  • 2021-01-30
  • 2016-10-01
  • 2017-03-21
  • 1970-01-01
  • 2017-09-05
相关资源
最近更新 更多