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

该PartialView还具有用于VM中项目的foreach循环,在该PartialView中,我有两个RenderAction呈现了另外两个Partials。

除了渲染速度以外,其他所有功能都可以正常工作。当我注释掉两个嵌套的RenderAction时,主要的局部 View 渲染得非常快。当我取消注释时,主要的局部 View 将在3到5秒之间呈现。即使我删除了部分 View 中的所有数据,也删除了操作中的所有数据以仅返回一个空 View ,它仍然需要3-5秒的时间。

不知何故,我的应用程序在渲染这两个部分时仍然存在问题,即使它们为空。

我的代码:
主要 Action :

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

我的主要PartialView:
@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”粘贴 Action 。但是正如我提到的,即使我从 Action 中删除了所有代码,并且渲染 View 仍需要3-5秒才能渲染整个 View ,两者之间没有任何区别。

我们想出的一种解决方案是完全删除部分,将每个部分的VM放入主VM中,并对部分中的HTML进行相同的处理。但是我喜欢在 View 上划分特定功能的想法。

最佳答案

LanFeusT(大名!),

RenderAction会产生一个完整的MVC周期,而不仅仅是使用当前的 Controller 上下文,这将导致性能开销。建议您寻求另一种方法(例如在viewModel中包括必需的元素)。我也很困难地发现了这一点,并且只有在对代码进行性能分析时,我才意识到每次新的RenderAction调用都会进行大量的反射(在99%的情况下,这既方便又合适)。

因此,我的底线建议是-扩展您的 View 模型。

我敦促您将Google RenderAction与RenderPartial进行比较,以获取更多信息。

看:

RenderAction RenderPartial

09-05 16:12