【发布时间】: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