【问题标题】:Render raw html from view component从视图组件渲染原始 html
【发布时间】:2016-04-13 12:07:23
【问题描述】:

对于非常简单的 ViewComponents,我想绕过一个视图,只返回一个编码的 HTML 字符串。

例子:

<ul>
   <li>One</li>
   <li>Two</li>
<ul>

我自己的实现是这样的:

public class RawHtmlResult : IViewComponentResult
{
    public RawHtmlResult(string EncodedHtml)
    {
        _encodedHtml = EncodedHtml;
    }
    public string _encodedHtml { get; set; }

    public void Execute(ViewComponentContext context)
    {
        context.Writer.Write(_encodedHtml);
    }

    public Task ExecuteAsync(ViewComponentContext context)
    {
        return context.Writer.WriteAsync(_encodedHtml);
    }
}

用法:

public async Task<IViewComponentResult> InvokeAsync(long id)
{
    var someArray = await _someService(id);
    var ulHelper = new TagBuilder("ul");
    var liHelper = new TagBuilder("li");

    foreach (var setName in someArray)
    {
        liHelper = new TagBuilder("li");
        liHelper.InnerHtml.Append(setName);
        ulHelper.InnerHtml.Append(liHelper);
    }
    var writer = new System.IO.StringWriter();
    ulHelper.WriteTo(writer, new HtmlEncoder());

    return new RawHtmlResult(writer.ToString());
}

到目前为止,我还没有找到合适的 IViewComponentResult。我错过了一点吗?

【问题讨论】:

  • 一个视图原始html,与标记混合。控制器应该必须对渲染做任何事情。否则你根本不应该使用 MVC - 这是错误的模式。也许您正在尝试解决一个不同的问题?为什么要在 MVC 框架中创建这样的原始 HTML?
  • 也许他正在开发一个 CMS 并且他的文章正文以 HTML 格式存储在数据库中? ;)
  • 您也可以查看HtmlString。对正在编码的标签助手内容使用了不同的答案。 stackoverflow.com/a/35672341/455493 不确定如何在控制器中使用它
  • @PanagiotisKanavos:你对 MVC 的使用是完全正确的,我同意。尽管如此,有时您不需要 100% 遵循路径,并且我可以保持我的代码库更小而不引入另一个“部分视图”......返回 Content("foo", "text/html"); 不起作用,因为 ViewComponent 仅支持返回 String、HtmlString 或 IViewComponentResult。感谢您的帮助!
  • @kdaveid 在这种情况下不是。您可以轻松地返回一组值并在视图中使用循环。或者使用适当的模型并将数组作为其属性之一传递。总行数少于您已经输入的内容

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


【解决方案1】:

视图组件上的Invoke()方法不需要返回IViewComponentResult,它可以返回HtmlString,所以你不需要IViewComponentResult的自定义实现。

例如:

public HtmlString Invoke()
{
    return new HtmlString(@"<b>Hello World</b>");
}

【讨论】:

    【解决方案2】:
    return Content("<ul><li>One</li><li>Two</li><ul>");
    

    方法是Controller.Content。您还可以使用它返回 HTML 以外的内容类型。

    如前所述,它不是返回 HTML 的首选方式——通常控制器应该返回一个模型,而视图应该提供 HTML。最好使用局部视图。但是出现了我们必须做这样的事情的场景。 (我自己也遇到过。)

    【讨论】:

    • 还需要指定第二个参数,内容类型:Content(html,"text/html")
    • 第二个参数是可选的。
    • 我的印象是,如果您省略了内容类型,它总是会返回 text/plain 但我只是检查了一下,它会返回正确的内容类型。也许这是自 MVC3 以来的新事物。
    • 问题是关于 ASP.NET Core / MVC6。提供的链接指的是 MVC5 之前的旧框架,因此可能无效,因为 MVC6 是完全重写的,没有 System.Web.* 和 IIS 依赖项
    • 这不起作用:返回Content("foo", "text/html"); 不起作用,因为ViewComponent 仅支持返回String、HtmlString 或IViewComponentResult。 (see above)
    【解决方案3】:

    对于未来的访客:

    Invoke() 方法返回HtmlContentViewComponentResult 的最简单方法。 HtmlContentViewComponentResult 是实现IViewComponentResult 接口的3 classes 之一。

    示例代码如下:

    public IViewComponentResult Invoke(object arguments)
    {
        return new HtmlContentViewComponentResult(
            new HtmlString("<ul><li>My HTML code</li></ul>"));
    }
    

    如您所见,HtmlContentViewComponentResult 需要 IHtmlContent 作为在视图上呈现的内容,因此最好的方法是使用 HtmlString 类。


    对于更复杂的结果,最好返回 View 而不是以编程方式生成原始 HTML。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 2022-10-02
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多