3

次のように、PagedList オブジェクト ( https://github.com/martijnboland/MvcPaging/blob/master/src/MvcPaging/PagedList.cs ) を Json にシリアル化しようとしています。

PagedList<Product> pagedList = new PagedList<Product>(products, (page - 1), pageSize);
string json = Newtonsoft.Json.JsonConvert.SerializeObject(pagedList);

上記のコードを使用すると、結果として、適切にシリアル化された Product オブジェクトの配列が得られます。ただし、以下の (PagedList の) プロパティは Json の結果に含まれていません。

    public bool HasNextPage { get; }
    public bool HasPreviousPage { get; }
    public bool IsFirstPage { get; }
    public bool IsLastPage { get; }
    public int ItemEnd { get; }
    public int ItemStart { get; }
    public int PageCount { get; }
    public int PageIndex { get; }
    public int PageNumber { get; }
    public int PageSize { get; }
    public int TotalItemCount { get; }

それらはシリアル化されていませんが、PagedList の一部です。

誰かが理由を知っていますか?また、シリアル化にこれらのプロパティを含めるにはどうすればよいでしょうか?

ありがとう

4

4 に答える 4

9

シリアライザーは、PagedList が列挙可能であることを認識し、それを JavaScript 配列にシリアライズします。これを簡単に処理できるようにするために、GetMetaData()前述のフィールドを正確に含む MetaData オブジェクトを返す PagedList オブジェクトの関数を公開します。これは、次のように pagedlist をシリアル化できることを意味します。

string json = Newtonsoft.Json.JsonConvert.SerializeObject(new{
  items = pagedList,
  metaData = pagedList.GetMetaData()
});

これにより、次のような JSON オブジェクトが生成されます。

{
    "Items": [
        { ... },
        { ... },
        { ... }
    ],
    "MetaData": {
        "PageSize": 1,
        "PageCount": 2,
        "HasNextPage": true,
        ...
    }
}
于 2012-06-21T04:06:30.913 に答える
0

これを行うために興奮して使用されるjqueryプラグインがあります:

https://github.com/turhancoskun/pagify.mvc

<script type="text/javascript">
$(function() {
    $('#users').pagify({
        dataUrl: '/User/UserLis',
        callBack: function(){
           // Ajax remove preloader and some other callbacks  
        },
        beforeSend: function(){
           // Ajax show preloader and some other function before start
        }
    });
}
</script>

readme.md ファイルには例が含まれています

于 2013-07-12T12:57:21.517 に答える
0

シリアル化するには、Troy の実装を使用するだけです。ただし、逆シリアル化するには、2 つの新しいクラスを作成します。

public class PaginationEntity<TEntity> where TEntity : class 
{
    public PaginationEntity()
    {
        Items = new List<TEntity>();
    }
    public IEnumerable<TEntity> Items { get; set; }
    public PaginationMetaData MetaData { get; set; }
}

public class PaginationMetaData
{
    public int Count { get; set; }
    public int FirstItemOnPage { get; set; }
    public bool HasNextPage { get; set; }
    public bool HasPreviousPage { get; set; }
    public bool IsFirstPage { get; set; }
    public bool IsLastPage { get; set; }
    public int LastItemOnPage { get; set; }
    public int PageCount { get; set; }
    public int PageNumber { get; set; }
    public int PageSize { get; set; }
    public int TotalItemCount { get; set; }
}

この方法で逆シリアル化します。

PaginationEntity<TEntity> listPaginated = JsonConvert.DeserializeObject<PaginationEntity<TEntity>>(json)

そして、あなたは行ってもいいです。

于 2016-08-12T02:24:39.193 に答える
0

デフォルトでは、asp.core は DataContractSerializer を使用するため、誰でもProduct クラスとメンバーに設定[DataContract]して、次のアクションで必要なデータを取得できます。[DataMember]

 public IActionResult Products(int page=1,int countPerPage=10)
    {
        var result = _dbContext.Products.AsNoTracking().ToPagedList(page, countPerPage);

        return Ok( new{result, total=result.TotalItemCount });
    }

Newtonsoft.Json を使用する必要はありません

于 2019-04-23T12:00:54.863 に答える