2017-12-13 6 views
0

剣道グリッドインライン編集CRUDの実装中にエラーが発生しました。新しいレコードを追加して更新すると、エラーコード500が返されます。エラー "無効なJSONプリミティブ:モデル。"コントローラにモデルを渡している間に剣道グリッドのデータソースにアクセスする

私はこの問題がparameterMapから発生していると考えています。剣道のコントローラーにモデルを渡す正しい方法は何ですか?

Invalid JSON primitive: models.

モデルとは何ですか?

ソースコード:

$(document).ready(function() { 
     var baseUrl = "/SomeUrl", 
      dataSource = new kendo.data.DataSource({ 
       transport: { 
        read: { 
         url: baseUrl + "/GetAccolades?profileId=" + @profileId, 
         type: "GET", 
         dataType: "json" 
        }, 
        create: { 
         url: baseUrl + "/AddAccolade", 
         type: "POST", 
         dataType: "json", 
         contentType: "application/json", 
        }, 
        update: { 
         url: baseUrl + "/UpdateAccolade", 
         type: "PUT", 
         dataType: "json", 
         contentType: "application/json", 
        }, 
        delete: { 
         url: baseUrl + "/DeleteAccolade", 
         type: "DELETE", 
         dataType: "json" 
        }, 
        parameterMap: function (options, operation) { 
         if (operation !== "read" && options.models) { 
          alert(kendo.stringify(options.models)); 
          return { models: kendo.stringify(options.models) }; 
         } 
        } 
       }, 
       batch: true, 
       schema: { 
        model: { 
         id: "ProfileAccoladeID", 
         fields: { 
          ProfileAccoladeID: { editable: false, nullable: false }, 
          ProfileID: { editable: false, nullable: false, defaultValue: @profileId }, 
          Years: { type: "string" }, 
          Name: { type: "string" }, 
          Level: { type: "string" }, 
          Event: { type: "string" },        
         } 
        } 
       } 
      }); 

     $("#accolades-grid").kendoGrid({ 
      dataSource: dataSource, 
      pageable: false, 
      height: 550, 
      toolbar: ["create"], 
      columns: [ 
       { field: "Years", width: "150px" }, 
       { field: "Name", title: "Name", width: "150px" }, 
       { field: "Level", title: "Level", width: "150px" }, 
       { field: "Event", title: "Event", width: "450px" },      
       { command: ["edit", "destroy"], title: " ", width: "250px" }], 
      editable: "inline" 
     }); 
    }); 
</script> 

コントローラ方法:

[HttpPost] 
    public JsonResult AddAccolade(ProfileAccolade accolade) 
    { 
     using (var db = new XXXEntities()) 
     { 
      if (accolade != null) 
      { 
       var newAccolade = new ProfileAccolade() 
       { 
        ProfileID = accolade.ProfileID, 
        Years = accolade.Years, 
        Name = accolade.Name, 
        Level = accolade.Level, 
        Event = accolade.Event 
       }; 
       db.ProfileAccolades.Add(newAccolade); 
       db.SaveChanges(); 

       return Json(new { Success = true }); 
      } 
      else 
      { 
       return Json(new { Success = false, Message = "Error occured" }); 
      } 
     } 
    } 

がどのように私はこのエラーを修正しますか?

アップデート:エラーInvalid JSON primitive: models.contentType: "application/json",を除去することにより

がなくなっています。ただし、コントローラはモデルを取得しません。

これを解決するためのアイデアはありますか?

+0

'alert(kendo.stringify(options.models)) 'からどのような種類のJSON文字列を取得しましたか?通常この問題は、JSON文字列形式ではなくURLエンコードされたパラメータを使用してメソッドを呼び出した後に発生します。 –

+0

見たことがありますか?https://stackoverflow.com/questions/18695302/kendo-datasource-parameter-map – jwatts1980

+0

@Tetsuya Yamamoto形式の整ったJSON文字列があります。 –

答えて

0

この問題は、transport.createtransport.updateの部分の両方でcontentType: "application/json"の使用に由来し、kendo.data.DataSourceの部分です。どちらの操作でもAJAX呼び出し(jQuery.ajax()メソッド)が使用されるため、contentTypeの設定は、送信するリクエストの種類に影響します。 、リクエスト本体はJSONコンテンツとして扱われます"application/json"コンテンツタイプを設定することにより

、実際modelsを含むtransport.parameterMap返すURLエンコードされたバージョンとキーと値のペア(KVP)としてフォーマットJSONストリング。このため、"無効なJSONプリミティブ"というエラーが発生します。これは、URLエンコード形式がJSON形式と異なるためです。

あなたはJSONデータとしてmodelsのURLエンコード形式を変換するJSON.stringifyメソッドを追加し、AJAX呼び出しの"application/json"設定を保持したい場合:

parameterMap: function (options, operation) { 
    if (operation !== "read" && options.models) { 
     return JSON.stringify({ models: kendo.stringify(options.models) }); 
    } 
} 

ただしデフォルトのコンテンツタイプ(application/x-www-form-urlencoded)としてparameterMapを送信する場合、それをバックに設定するために、すべてのcontentType定義を削除します。

dataSource = new kendo.data.DataSource({ 
    transport: { 
     read: { 
      url: baseUrl + "/GetAccolades?profileId=" + @profileId, 
      type: "GET", 
      dataType: "json" 
     }, 
     create: { 
      url: baseUrl + "/AddAccolade", 
      type: "POST", 
      dataType: "json" 
     }, 
     update: { 
      url: baseUrl + "/UpdateAccolade", 
      type: "PUT", 
      dataType: "json" 
     }, 
     delete: { 
      url: baseUrl + "/DeleteAccolade", 
      type: "DELETE", 
      dataType: "json" 
     }, 
     parameterMap: function (options, operation) { 
      if (operation !== "read" && options.models) { 
       alert(kendo.stringify(options.models)); 
       return { models: kendo.stringify(options.models) }; 
      } 
     } 
    }, 
    // other DataSource definitions 
}); 

参考:

kendo.data.DataSource (Kendo UI Documentation)

+0

ありがとうございました。"application/json"を削除してエラーを修正しました。ただし、コントローラは剣道から渡されたモデルを受信しません。何か案は? –

+1

解決策が見つかりましたhttps://www.telerik.com/forums/parametermap---no-models-sent-to-controller-001b5bef1c02 –

+0

あなたはすでに 'transport'に' batch = true'を持っています。したがって、2番目の解決法( 'contentType'を削除する)は今すぐ動作するはずです。それはあなたの問題がすでに解決されているのか、それともまだ見逃しているのでしょうか? –

関連する問題