3

mvc4を使用しています。私のページの 1 つに、Kendo Grid があります。1 ページあたり 5 行を表示したい。純粋なjavascriptを使用しても問題ありませんが、mvcヘルパーを使用している場合. オンラインでサンプルを見つけることができませんでした。

これが私のJavaScriptコードです。

        <script language="javascript" type="text/javascript">

            $(document).ready(function () {
                $("#grid").kendoGrid({
                    dataSource: {
                        type: "json",
                        serverPaging: true,
                        pageSize: 5,
                        transport: { read: { url: "Products/GetAll", dataType: "json"} },
                        schema: { data: "Products", total: "TotalCount" }
                    },
                    height: 400,
                    pageable: true,
                    columns: [
                            { field: "ProductId", title: "ProductId" },
                            { field: "ProductType", title: "ProductType" },
                            { field: "Name", title: "Name" },
                            { field: "Created", title: "Created" }
                        ],
                    dataBound: function () {
                        this.expandRow(this.tbody.find("tr.k-master-row").first());
                    }
                });
            });

今、mvcヘルパーを使用している場合

            @(Html.Kendo().Grid(Model)
                .Name("Grid")  //please help me to finish the rest

更新

アクション コードの追加。

    [HttpPost]
    public ActionResult GetAll([DataSourceRequest]DataSourceRequest request, int id)
    {
        var products= ProductService.GetAll(id);

        return Json(products.ToDataSourceResult(request));
    }

サービス層の GetAll メソッド:

    public IQueryable<Product> GetAll(int id)
    {
        var products= ProductRepository.Get(p => p.Id== id && p.IsActive == true, null, "ProductionYear")
                    .OrderBy(o => o.Name); //.ToList();

        return Product.Select(p => new ProductVM()
        {
            Name = p.Name,
            ProductionYear= p.ProductionYear.Year.ToString()
            Id = p.Id
        }).AsQueryable();
    }

今、アプリを実行すると、次のエラーが表示されます。

「LINQ to Entities はメソッド 'System.String ToString()' メソッドを認識しないため、このメソッドはストア式に変換できません。」}

GetAll メソッドで、"ToList()" をコメントアウトします。ToList を使用すると、すべてが機能します。ただし、そのページに必要な行だけではなく、すべての行を照会します。

4

5 に答える 5

5

Kendo の ASP.NET MVC ラッパーを使用しておらず、Kendo JavaScript オブジェクトを直接使用ており、サーバー側のページングを実行しようとしている場合は、次のようにデータソースを作成する必要があります。

var dataSource = {
    "type":"aspnetmvc-ajax",
    "serverSorting": true,
    "serverPaging": true,
    "page": 1,
    "pageSize": 8,
    "schema": {
      "data":"items",
      "total":"count",
      "errors":"errors"
    }
};

Read コントローラ メソッドは次のようになります。

    public ActionResult List_Read([DataSourceRequest]DataSourceRequest request) {
        try {
            var model = null /* prepare your model object here contain one page of grid data */;

            // using Json.NET here to serialize the model to string matching the
            // schema expected by the data source
            var content = JsonConvert.SerializeObject(new { count = model.Count, items = model.Items }, Formatting.None);

            return Content(content, "application/json");
        }
        catch (Exception exception) {
            // log exception if you need to

            var content = JsonConvert.SerializeObject(new { errors = exception.Message.ToString() }, Formatting.None);

            return Content(content, "application/json");
        }
    }

typeserverSortingおよびserverPagingページングとソートがサーバー側で確実に行われるようにすることが重要です。type そうしないaspnetmvc-ajax、Read メソッドの [DataSourceRequest] 属性で指定されたモデル バインダーによってクエリ データが認識されません。ASP.NET MVC の DefaultModelBinder で使用されるモデル バインド規則に準拠していない kendo dataSource によって送信されたクエリ データを解析する独自のカスタム モデル バインダーを作成する場合を除き、この属性を省略できません。

于 2013-02-14T14:04:09.933 に答える
5

DataSource メソッドPageSize内で設定できます。したがって、次のようなものが必要になります。

@(Html.Kendo().Grid(Model)
     .Name("Grid") 
     .DataSource(dataSource => dataSource.Ajax()
                                    .PageSize(5)
                                    .Read(c => c.Action("GetAll", "Products")
                                    .Model(s => s.Id(m => m.Id)))
     .Columns(columns =>
     {
        columns.Bound(m => m.ProductId).Title("ProductId");
        //other colums
     })
    .Events(g => g.DataBound("somefunction"))
    .Pageable(true))

詳細については、KendoUI Grid のAsp.NET MVC ラッパーのドキュメントを参照してください。

于 2012-10-03T19:03:19.180 に答える
0

Kendo UI for ASP.NET MVC を使用している場合は、他の答えが機能します。そうでない場合は、自分でページングを実装する必要があります。Kendo DataSource は、リクエスト時に pageSize と現在のページを送信します。それを使用してページングを行うことができます。また、「テイク」と「スキップ」を送信して、物事をさらに簡単にします (ヒント Linq)。

于 2012-10-03T19:41:10.130 に答える
0

剣道の例をダウンロードし、解凍 してビュー インデックス の ASP.NET MVC Q1 と IndexControllerの<your directory>\Kendo UIASP.NET MVC Q1 に従ってください2013\wrappers\aspnetmvc\Examples\Areas\razor\Views\web\grid\<your directory>\Kendo UI2013\wrappers\aspnetmvc\Examples\Controllers

ビューでは、JSON JavaScriptSerializer を使用したシリアライゼーションまたはデシリアライゼーション中のエラーを回避するために、次のように .ServerOperation(true) も必要になる場合があります。文字列の長さが maxJsonLength プロパティで設定された値を超えています。フェッチするビッグデータがある場合

@(Html.Kendo().Grid(<yourmodel>)
    .Name("Grid")
    .Columns(columns =>
       ...
    })

        .Filterable()
        .Pageable()

        .DataSource(dataSource => dataSource
            .Ajax()
            .PageSize(8)
            .ServerOperation(true) )

            .Model(model =>
            {
                model.Id(p => p.Id);
                ...
            })
        )
    )

ActionResult Products_Read のコントローラーでも考慮

  DataSourceResult result = GetProducts().ToDataSourceResult(request,  o => new { Id = o.Id, ... } );
  return Json(result , JsonRequestBehavior.AllowGet);
于 2013-09-18T14:21:39.140 に答える
0

エラー「LINQ to Entities はメソッド 'System.String ToString()' メソッドを認識しません。このメソッドはストア式に変換できません。」} は自明です。これを回避するには、次のようなことを行う必要があります。

return Product.**AsEnumerable**.Select(p => new ProductVM()
        {
            Name = p.Name,
            ProductionYear= p.ProductionYear.Year.ToString()
            Id = p.Id });

AsEnumerable を使用すると、データベースからすべてのレコードが取得されるため、フィルタリングの後に使用するのが最適です

products.where(x => x.active = true).AsEnumerable

products.AsEnumerable.where(x => x.active = true) ではなく

于 2013-03-15T02:45:30.230 に答える