在ASP中组合ViewComponents.Net 5 MVC 6
本文关键字:MVC Net ViewComponents ASP 组合 | 更新日期: 2023-09-27 18:11:42
我试图从控制器组合多个不同的ViewComponents。所有组合视图组件的ActionResult都将呈现给浏览器。本文基于一篇文章,该文章使用了PartialViews并使用ajax更新了PartialViews。那篇文章是基于以前版本的MVC。更多信息请参见:https://www.simple-talk.com/dotnet/asp.net/revisiting-partial-view-rendering-in-asp.net-mvc/
几个小时后,我得到了下面的代码示例。但问题是,它只适用于第一个viewComponent。当我改变viewcomponents的顺序时,它仍然渲染第一个。它似乎和我的viewcomponents没有任何关系。在第二次循环中,它总是以"vc.ExecuteResultAsync(context);"结束,没有任何错误。所以渲染第一个总是成功的。
顺便说一下,我使用的是VS 2015 Enterprise with Beta7 of MVC6和所有其他依赖项。
请帮忙!
public async Task<IActionResult> Dashboard()
{
// Combine multiple viewcomponents
return new MultipleViewResult(
ViewComponent(typeof(OrdersViewComponent))
, ViewComponent(typeof(AccountsViewComponent))
);
}
public class MultipleViewResult : ActionResult
{
public const string ChunkSeparator = "---|||---";
public IList<ViewComponentResult> ViewComponentResults { get; private set; }
public MultipleViewResult(params ViewComponentResult[] views)
{
if (ViewComponentResults == null)
{
ViewComponentResults = new List<ViewComponentResult>();
}
foreach (var v in views)
ViewComponentResults.Add(v);
}
public override async Task ExecuteResultAsync(ActionContext context)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
byte[] chunkSeparatorBytes = System.Text.Encoding.UTF8.GetBytes(ChunkSeparator);
var total = ViewComponentResults.Count;
for (var index = 0; index < total; index++)
{
var vc = ViewComponentResults[index];
// No matter which viewcomponent, this line works only with the first viewcomponent.
await vc.ExecuteResultAsync(context);
if (index < total - 1)
{
await context.HttpContext.Response.Body.WriteAsync(chunkSeparatorBytes, 0, chunkSeparatorBytes.Length);
}
}
}
}
失败,因为第一个vc.ExecuteResultAsync(context)
将设置ContentType
属性并刷新响应。对vc.ExecuteResultAsync(context)
的任何后续调用也将尝试设置ContentType
属性,但将失败,因为响应已经流回客户端。
除了创建自己的HttpContext
实例之外,我想不出任何更好的解决方案,即使部分响应已经被发送回来,也可以允许您写入ContentType属性,但这是混乱的。
如果你认为这是一个bug(我个人认为这是因为ViewComponentResult应该检查响应是否已经在设置ContentType之前发送),那么你可以总是提交一个bug报告。