首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套的RenderAction呈现速度非常慢

嵌套的RenderAction呈现速度非常慢
EN

Stack Overflow用户
提问于 2011-08-18 05:15:29
回答 1查看 2.1K关注 0票数 7

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

对于VM中的项,该PartialView还有一个foreach循环,在该PartialView中,我有两个呈现另外两个Partial的RenderAction。

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

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

我的代码: Main action:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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; }
}

我的主PartialView:

代码语言:javascript
复制
@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执行相同的操作。但我喜欢在视图上划分特定功能的想法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-18 05:34:29

LanFeusT (伟大的名字!!),

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

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

我强烈建议你在谷歌上搜索RenderAction vs RenderPartial以获取更多信息..

请参见:

RenderAction RenderPartial

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7099582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档