从视图组件渲染原始html

时间:2016-04-13 12:07:24

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

对于非常简单的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。我想念apoint吗?

3 个答案:

答案 0 :(得分:3)

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

例如:

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

答案 1 :(得分:1)

return Content("<ul><li>One</li><li>Two</li><ul>");

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

如上所述,它不是返回HTML的首选方式 - 通常控制器应返回模型,视图应提供HTML。最好使用局部视图。但是我们必须做这样的事情。 (我自己刚遇到一个。)

答案 2 :(得分:0)

对于将来的访客:

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

这是示例代码:

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

您可能会看到HtmlContentViewComponentResult要求IHtmlContent作为要在视图上呈现的内容,所以最好的方法是使用HtmlString类。


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