3 votes

Le rendu de la vue prend beaucoup de temps

Nous avons une application Web MVC 4. J'ai utilisé miniprofiler pour vérifier le temps que cela prend et il montre que le rendu d'une vue avec trois vues partielles prend un temps très long. J'ai essayé de déplacer les informations dans les vues partielles directement sur la page et cela n'a fait aucune différence dans les temps. Que dois-je faire pour réduire le temps de rendu ? Avez-vous des conseils sur la façon dont je devrais commencer à chercher ? Comme vous pouvez le constater, le rendu prend 48 secondes.

                                         **| duration | from start(ms)**
|http://localhost:61380/CaseContacts     | 653.7    | +0.0 
|Controller: CaseController.Contacts     | 11.9     | +641.1 
|    Contacts view - not an ajax request | 0.3      | +651.7
|        populating view model           | 0.0      | +652.1
|    getting list of contacts            | 374.4    | +652.1
|    Find: Contacts                      | 499.8    | +1033.6
|    Render: Contacts                    | 48400.8  | +1535.2

**| client event           |duration(ms)| from start(ms)**
|Request start           |            | +2.0
|Response                |   1.0      | +52245.0
|Dom loading             |            | +52247.0
|scripts                 | 390.0      | +52315.0 
|Dom Content Loaded Event| 29.0       | +52707.0
|Dom Interactive         |            | + 52707.0
|Load Event              |            | + 52760.0
|Dom Complete            |            | + 52760.0

Mise à jour :

public IQueryable<T> FindQueryable(Expression<Func<T, bool>> predicate, Func<T, Object> orderBy)
    {
        return this.db.GetAll<T>().Where(predicate).OrderBy(orderBy).AsQueryable<T>();
    }
public class ContactRepository : Repository<USRContact>, IContactRepository<USRContact>
{
    public IList<ContactNameViewModel> GetAll(int fieldOfficeID, string searchText = "")
    {
        if (searchText.Length > 0)
            return Mapper.Map<IList<USRContact>, IList<ContactNameViewModel>>(this.FindQueryable(x => (x.FieldOfficeID == fieldOfficeID) &&
            (x.FormalName.Contains(searchText) || x.PreferredName.Contains(searchText) || x.Alias.Contains(searchText) || x.Pseudonym.Contains(searchText)), x => (x.STMGender.Gender)).ToList());
        else
            return Mapper.Map<IList<USRContact>, IList<ContactNameViewModel>>(this.FindQueryable(x => (x.FieldOfficeID == fieldOfficeID)).ToList());
    }

Ensuite, mon contrôleur charge les résultats sur un viewmodel et ensuite :

@Html.Partial("~/Views/Shared/Contacts/ContactNameList.cshtml", Model.Contacts)

La vue partielle contient le code suivant :

@model IList<Casenator.Web.Models.Contact.ContactNameViewModel>
<ul id="NameList" style="margin-left:0">
    @foreach (var item in Model)
    {
        @*<li>@Html.RouteLink(@item.FullName, "Contacts", new { id = item.ContactID })</li>*@
        <li>@Ajax.RouteLink(item.FullName, "Contacts", new { id = item.ContactID }, new AjaxOptions { UpdateTargetId = "BasicInfo", OnSuccess="InitializeComboBoxes", OnBegin="LoadContact(" + item.ContactID + ")" }) </li>
    }
</ul>

Toute aide sera appréciée ! Merci, Safris

1voto

Tassadaque Points 4317

Ce que vous renvoyez de la requête est important. Si vous renvoyez IEnumerable Il serait préférable de revenir IQueryable . Vous pouvez voir ce question qui pourrait vous aider dans votre situation

Je ne pense pas que automapper Les outils de ce type sont conçus pour cartographier de nombreux recoins. Vous pouvez essayer de cartographier l'objet manuellement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X