Вложенные RenderAction отображаются очень медленно - PullRequest
7 голосов
/ 18 августа 2011

У меня есть действие PartialViewResult, которое отображает PartialView, который я вызываю из вызова $ .ajax на странице.

Этот PartialView также имеет цикл 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
    });
}

Связанная с ним модель представления:

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», если это необходимо.Но, как я уже упоминал, даже если я удаляю весь код из действия и представление, для рендеринга все равно требуется 3-5 секунд, нет никакой разницы.

Одним из решений, которое мы придумали, было быполностью удалите частичные компоненты, поместите ВМ каждого частичного элемента в основную ВМ и сделайте то же самое для HTML в частичных элементах.Но мне нравится идея разделения отдельных функций в представлении.

1 Ответ

3 голосов
/ 18 августа 2011

LanFeusT (великое имя !!),

RenderAction приведет к снижению производительности, поскольку он совершает полный цикл MVC, а не просто использует текущий контекст контроллера. Вам может быть рекомендовано искать альтернативный подход (например, включить необходимые элементы в вашу viewModel). Я также нашел это трудным путем, и только при профилировании моего кода я оценил количество размышлений, происходящих для каждого нового вызова RenderAction (что в 99% случаев удобно и уместно).

Итак, мой практический совет - взгляните на расширение вашей модели представления.

Я настаиваю на том, чтобы узнать подробности в Google RenderAction и RenderPartial.

см

RenderAction RenderPartial

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...