在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);
            }
        }
    }
}

在ASP中组合ViewComponents.Net 5 MVC 6

失败,因为第一个vc.ExecuteResultAsync(context)将设置ContentType属性并刷新响应。对vc.ExecuteResultAsync(context)的任何后续调用也将尝试设置ContentType属性,但将失败,因为响应已经流回客户端。

除了创建自己的HttpContext实例之外,我想不出任何更好的解决方案,即使部分响应已经被发送回来,也可以允许您写入ContentType属性,但这是混乱的。

如果你认为这是一个bug(我个人认为这是因为ViewComponentResult应该检查响应是否已经在设置ContentType之前发送),那么你可以总是提交一个bug报告。