对于非常简单的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吗?
答案 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。