3

MVC 4 Web アプリケーションがあります。miniprofiler を使用して所要時間を確認したところ、3 つの部分ビューを含むビューのレンダリングに非常に長い時間がかかっていることがわかりました。部分ビューの情報をページに直接移動しようとしましたが、時間にまったく違いはありませんでした。レンダリング時間を短縮するにはどうすればよいですか? どこから見始めるべきかについてのヒントはありますか?ご覧のとおり、レンダリングには 48 秒かかります。

                                         **| 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

アップデート:

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

次に、コントローラーが結果をビューモデルにロードし、次のようにします。

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

部分ビューには、次のコードが含まれています。

@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>

どんな助けでも大歓迎です!ありがとう、サフリス

4

1 に答える 1

1

クエリから何を返すかが重要です。戻るなら 戻っIEnumerableたほうがいいですIQueryableこの質問が表示される場合があります。状況に応じて役立つ場合があります

automapperツールが多くの記録をマッピングするように設計されているとは思いません。オブジェクトを手動でマッピングしてみてください

于 2013-03-04T21:47:38.077 に答える