48

インデックス ビューのページングを取得するために PagedList パッケージを試しています。すべてが順調に進んでおり、コントローラー レベルではすべて正常に動作しています。1 ページあたり 5 レコードしか表示されず、クエリ文字列に基づいて適切なページが表示されます。

私の問題はビューにあります。@Model を に変更して、およびその他のプロパティにPagedList.IPagedListアクセスできるようにしましたが、機能しなくなりました。次のエラーが表示されます。Model.HasNextPage@Html.DisplayNameFor(model => model.ItemName)

PagedList.IPagedList<Dossier.Models.Item>' does not contain a definition for 'ItemName' and no extension method 'ItemName' accepting a first argument of type 'PagedList.IPagedList<Dossier.Models.Item>' could be found (are you missing a using directive or an assembly reference?)

ビューの関連部分は次のとおりです。

@model PagedList.IPagedList<Dossier.Models.Item>
@using Dossier.Models.Item

...

<th>
    @Html.DisplayNameFor(model => model.ItemName)
</th>

IPagedList は DisplayNameFor() と互換性がないようです。なぜこれが起こっているのか、どうすれば修正できるのでしょうか? 列名を手動で入力するだけでよいことはわかっていますが、その情報を後でモデルに残しておきたい (そして変更可能にしたい)。

4

5 に答える 5

84

これを試すことができます

@Html.DisplayNameFor(model => model.FirstOrDefault().ItemName)
于 2013-02-27T01:35:18.820 に答える
43

受け入れられた回答の代替ソリューションとして、IPagedList は IEnumerable から継承することに注意してください。つまり、次のように記述できます。

@model IEnumerable<Dossier.Models.Item>

ページの冒頭で、必要に応じてモデルを IPagedList にキャストします。

@Html.PagedListPager((IPagedList)Model, page => Url.Action("Index", new { page = page }))

ページ内で複数回使用するために、キャストされた変数をヘッダーで宣言することもできます。

@{
    ViewBag.Title = "My page title";
    var pagedlist = (IPagedList)Model;
}

これにより、DisplayNameFor ヘルパー メソッドを使用して、すべての PagedList メソッド/プロパティにアクセスできます。ダミー要素を使用したり、フィールドごとに .FirstOrDefault() を呼び出したりする必要はありません。

于 2014-06-30T11:09:17.580 に答える
4

DisplayNameForを受け入れる のオーバーロードを作成することで問題を解決しましたIPagedList<TModel>

namespace PagedList.Mvc
{
    public static class Extensions
    {

        [SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")]
        public static MvcHtmlString DisplayNameFor<TModel, TValue>(this HtmlHelper<IPagedList<TModel>> html, Expression<Func<TModel, TValue>> expression)
        {
            return DisplayNameForInternal(html, expression);
        }

        [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", Justification = "This is an extension method")]
        internal static MvcHtmlString DisplayNameForInternal<TModel, TValue>(this HtmlHelper<IPagedList<TModel>> html, Expression<Func<TModel, TValue>> expression)
        {
            return DisplayNameHelper(ModelMetadata.FromLambdaExpression(expression, new ViewDataDictionary<TModel>()),
                                     ExpressionHelper.GetExpressionText(expression));
        }

        internal static MvcHtmlString DisplayNameHelper(ModelMetadata metadata, string htmlFieldName)
        {
            string resolvedDisplayName = metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last();

            return new MvcHtmlString(HttpUtility.HtmlEncode(resolvedDisplayName));
        }
    }
}

PageList プロジェクトにプル リクエストを送信して、全員のプロジェクトに含めます。

于 2015-02-10T14:43:26.730 に答える
0

別の解決策として、次のことを試すことができます。

@Html.DisplayNameFor(x => x.GetEnumerator().Current.ItemName)

リストが空でも機能します!

于 2020-05-05T21:16:05.183 に答える