1

AngularJS を KendoUI と共に使用して、WebAPI Web サービスからデータを取得するグリッドを作成しています。グリッドについては、サーバー側の並べ替え、ページング、フィルタリング、およびグループ化を許可したいと考えています。この目的のために、KendoGridBinderExライブラリを使用しようとしています。

KendoGridBinderEx ソースをダウンロードし、サンプル プロジェクトを実行すると、問題なく動作します。ただし、プロジェクトでまったく同じことを行うと、グリッドの列でフィルターを実行しようとすると、次のエラーが発生します。

System.Linq.Dynamic.ParseException: タイプ 'MyEntity' にプロパティまたはフィールド 'test' が存在しません

「test」はフィルターに入力しているものなので、フィルター テキストにする必要があります。「test」というプロパティやフィールドを探すべきではありません。

私は Fiddler をデバッグして使用し、リクエストで送信されるリクエストのフィルター部分が例の作業中のリクエストとまったく同じであることを確認したので、問題はリクエスト側にあるとは思いません。

すべてのコード ブロックについて、スペースを節約し、関係のないものを切り取るために、すべてを単純化しています。たとえば、データベース コードを切り取り、その場でエンティティのリストを生成していますが、それでも問題が発生するため、Entity Framework コードの問題ではないことがわかっています。

これが私のJSコードです:

    var myDataSource = {
        transport: {
            read: {
                url: function () {
                    return url;
                },
                type: 'post',
                dataType: 'json'
            },
            parameterMap: function (options, operation) {
                if (options.filter) {
                    KendoGrid_FixFilter(myDataSource, options.filter);
                }

                if (operation === "read") {
                    // convert the parameters to a json object
                    return kendo.stringify(options);
                }

                return options;
            }
        },
        serverPaging: true,
        serverSorting: true,
        serverFiltering: true,
        serverGrouping: true
        schema: {
            data: 'data',
            groups: 'groups',
            aggregates: 'aggregates',
            total: 'total',
            model: {
                id: "id",
                fields: {
                    id: { type: "number" },
                    name: { type: "string" },
                    description: { type: "string" }
                }
            }
        },
    };

そして、ここに私のWebAPIコントローラーコードがあります:

    [System.Web.Http.Route("api/MyEntity")]
    [System.Web.Http.HttpPost]
    public KendoGridEx<MyEntity, MyEntity> GetMyEntities(KendoGridApiRequest request)
    {
        var entList = new List<MyEntity>();
        for (int i = 0; i < 10; i++)
        {
            var newEntity = new MyEntity
            {
                Id = i,
                Name = "test",
                Description = "description"
            };
            entList.Add(newEntity);
        }
        return entList.AsQueryable().ToKendoGridEx<MyEntity, MyEntity>(request);
    }

したがって、「名前」列に「テスト」の値で「含む」フィルターを設定すると、上記のエラーが発生します。理由についてのアイデアはありますか?

4

3 に答える 3

0

これに苦労して一日を過ごした後、今日ようやくSOに投稿しました。そしてもちろん、質問をしてから数分後に答えを見つけました!

問題は、クライアント側の JS コードとエンティティの間で列名の大文字と小文字が異なることでした。私のWebApiConfigでは、使用しています

        // Web API configuration and services
        var settings = config.Formatters.JsonFormatter.SerializerSettings;
        settings.Formatting = Formatting.Indented;
        settings.ContractResolver = new CamelCasePropertyNamesContractResolver();

このコードは、WebAPI がデータを返すときに、すべてのフィールド名がキャメル ケースに変換されるようにします。JS側はキャメルケースで、C#側はパスカルケースで全てコーディングしたかったからです。

最初に私を驚かせたのは、Sort などの他の KendoGridApiRequest 操作が、プロパティ名に関して大文字と小文字を区別しないように見えることでした。もう 1 つは、エラー メッセージが、フィルター値をプロパティとして探していることを示していることです。「タイプ「MyEntity」にはプロパティまたはフィールド「名前」が存在しません」と言うべきでした。そうすれば、それがケーシングから外れていることがすぐにわかったでしょう。

ここで、リクエスト プロパティを Pascal ケースに変換する方法を理解する必要があります。最悪のシナリオでは、すべてを同じケースに変換する必要がありますが、それは大変な作業になります (エンティティは、ここでのサンプルが示すよりもはるかに複雑です)。

于 2015-09-02T15:39:19.200 に答える
0

タイプ 'MyEntity' にプロパティまたはフィールド 'test' が存在しません。

Id、Name、Descriptionの値しか見つからないと思います..メッセージは「プロパティとフィールドを検索します..」

Id、Name、Description は唯一の「プロパティまたはフィールド」です。

--'test' は値であり、プロパティやフィールドではありません--

于 2015-09-02T15:31:45.017 に答える