【问题标题】:Nested RenderAction are rendered very slowly嵌套的 RenderAction 渲染速度非常慢
【发布时间】:2011-08-17 21:15:28
【问题描述】:

我有一个 PartialViewResult 操作,它呈现一个我从页面上的 $.ajax 调用中调用的 PartialView。

该 PartialView 还具有用于 VM 中项目的 foreach 循环,并且在该 PartialView 中,我有两个 RenderAction 来呈现其他两个 Partials。

一切正常,除了渲染速度。当我注释掉两个嵌套的 RenderAction 时,主要的局部视图渲染得非常快。当我取消注释它们时,主要的局部视图会在 3 到 5 秒之间呈现。即使我从部分视图中删除所有数据并从操作中删除所有数据以仅返回一个空视图,它仍然需要 3-5 秒。

不知何故,我的应用在渲染这两个部分时遇到问题,即使它们是空的。

我的代码: 主要行动:

public PartialViewResult MyTasks(int milestoneId, int currentPage = 1)
{
    var mergedTasks = new List<MergedTask>();   
    var TrackingTeams = _TrackingTeams.GetAll().ToList();
    var pagingInfo = new PagingInfo() {CurrentPage = currentPage, ItemsPerPage = 10, TotalItems = _TrackingTeams.GetAll().Count() };                                                                     
    mergedTasks.AddRange(from TrackingTeam in TrackingTeams
                       let task = allTasks.Single(x=>x.TestId == (int)TrackingTeam.TrackingTask.TestId)
                       select new MergedTask()
                       {                           
                           Summary = TrackingTeam.TrackingTask.Description,
                           InternalId = task.Id,
                           DevTrackingTask = TrackingTeam.TrackingTask,
                           LastUpdate = task.DateModified
                       });

    return PartialView(new DevTrackingTaskViewModel
    {
        MergedTasks = mergedTasks,
        Category = _categories.GetById(categoryId),
        PagingInfo = pagingInfo
    });
}

与之关联的 ViewModel:

public class TrackingTaskViewModel
{
    public List<MergedTask> MergedTasks { get; set; }
    public int CountTasks { get; set; }
    public PagingInfo PagingInfo { get; set; }
    public Category Category { get; set; }
}

public class MergedTask
{
    public int InternalId { get; set; }
    public string Summary { get; set; }
    public TrackingTask TrackingTask { get; set; }
    public DateTime LastUpdate { get; set; }
}

我的主要部分视图:

@foreach (var item in Model.MergedTasks)
{
    <script type="text/javascript">
        $(document).ready(function () {
            $("#TrackingTask@(item.TrackingTask.Id)").hover(function () {
                if ($("#snapshotFixerForTrackTask@(item.TrackingTask.Id)").length == 1) {
                    $("#expandTrackingTaskForTask@(item.TrackingTask.Id)").removeClass("hide");
                }
                else {
                    $("#expandTrackingTaskForTask@(item.TrackingTask.Id)").toggleClass("hide");
                }
            });
        });
    </script>

    <div class="TrackingTaskDiv" id="TrackingTask@(item.TrackingTask.Id)">
        <div class="TrackingContainer">
            <div id="flagsForTrackingTask@(item.TrackingTask.Id)" class="flags">
               @{Html.RenderAction("ShowFlags", "Task", new { trackingid = item.TrackingTask.Id });}
            </div>

            <div id="TestStatusForTrackTask@(item.TrackingTask.Id)" class="TestStatusWrapper">
                @{Html.RenderAction("CheckTrackStatus", "Task", new { trackingid = item.TrackingTask.Id });} 
            </div>
        </div>
        <div id="expandTrackingTaskForTask@(item.TrackingTask.Id)" class="expandTrackingTask collapsed hide"></div>
    </div>    
}

如果需要,我可以粘贴“ShowFlags”和“CheckTrackStatus”的操作。但正如我提到的,即使我从动作和视图中删除所有代码,渲染仍然需要 3-5 秒来渲染整个视图,没有区别。

我们提出的一个解决方案是完全删除部分,将每个部分的 VM 放在主 VM 中,并对部分中的 HTML 执行相同的操作。但我喜欢在视图上划分特定功能的想法。

【问题讨论】:

    标签: asp.net-mvc performance partial-views


    【解决方案1】:

    LanFeusT(好名字!!),

    RenderAction 会导致性能开销,因为它会进行完整的 MVC 循环,而不仅仅是使用当前控制器上下文。可能会建议您寻求替代方法(例如在您的 viewModel 中包含所需的元素)。我也发现了这一点很困难,只有在分析我的代码时,我才意识到每次新的 RenderAction 调用所进行的反射量(在 99% 的情况下,这既方便又合适)。

    所以我的底线建议 - 看看扩展你的视图模型。

    我敦促您谷歌 RenderAction 与 RenderPartial 以获取更多信息..

    见:

    RenderAction RenderPartial

    【讨论】:

    • 是的,成功了,我真的没想到它会起作用,或者至少会产生很大的不同。但是将嵌套 VM 传递给主 VM 并仅使用 RenderPartial 将加载时间从 3-5 秒降低到 500-600 毫秒。谢谢!
    • 酷,我和你做了一模一样的头发拉,但现在我知道什么时候使用 RA 和 RP。很高兴它有所作为(并且重构起来非常简单)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2014-11-20
    相关资源
    最近更新 更多