2017-02-02 9 views
-2

私はいくつかのデータを渡すためにWeb APIを呼び出すMVCアプリケーションを持っています。ここで空のJson配列が投稿で受信されました

MVC符号

 [AcceptVerbs(HttpVerbs.Post)] 
    public async System.Threading.Tasks.Task<ActionResult> StudentViewModels_Create([DataSourceRequest]DataSourceRequest request, [Bind(Prefix = "models")]IEnumerable<StudentViewModel> studentviewmodels) 
    { 
     using (System.Net.Http.HttpClient client = new System.Net.Http.HttpClient()) 
     { 
      string baseUrl = "http://localhost:51514/api/Students"; 
      client.BaseAddress = new Uri(baseUrl); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); 

      JArray postData = new JArray(); 
      //postData.Add(JsonConvert.SerializeObject(request)); 
      foreach(StudentViewModel student in studentviewmodels) 
      { 
       postData.Add(JsonConvert.SerializeObject(student)); 
      } 
      // call the web-api and pass the data 
      System.Net.Http.HttpResponseMessage response = await client.PostAsync(baseUrl, new StringContent(new JavaScriptSerializer().Serialize(postData), Encoding.UTF8, "application/json")); 
      if (!response.IsSuccessStatusCode) 
      { 
       var data = response.Content.ReadAsStringAsync(); 
      } 
     } 

     // this will return new data 
     //return Json(""); 
    } 

は、それがしかし、コールは、APIに達したときに

enter image description here

に送信される前POSTDATA変数であるデータの写真であります、Json配列は空です。

のWeb-API

public IHttpActionResult Students_Create(JArray inputData) 
    { 

     var students = new List<Student>(); 

     for (int i = 1; i<inputData.Count; i++) 
     { 
      var tempStudent = new Student(); 
      tempStudent = (Student)JsonConvert.DeserializeObject(inputData[i].ToString()); 
      students.Add(tempStudent); 
     } 

     // Will keep the inserted entitites here. Used to return the result later. 
     var entities = students; 
     if (ModelState.IsValid) 
     { 
      using (var northwind = new StudentEntities()) 
      { 
       foreach (var student in students) 
       { 
        // Create a new Student entity and set its properties from the posted StudentViewModel. 
        var entity = new Student 
        { 
         Studentid = student.Studentid, 
         Firstname = student.Firstname, 
         Lastname = student.Lastname, 
         Age = student.Age 
        }; 
        // Add the entity. 
        northwind.Students.Add(entity); 
        // Store the entity for later use. 
        entities.Add(entity); 
       } 
       // Insert the entities in the database. 
       northwind.SaveChanges(); 
      } 
     } 

     return Json(db.Students); 
    } 
引数inputDataの

変数

enter image description here

任意のアイデアこれが起こっている理由として?。助けてくれてありがとう。

+0

私はこれの一部に少し不安定だけど、あなたは、 ')' client.PostAsync(baseUrlに、POSTDATA、Encoding.UTF8、 "アプリケーション/ JSONを")待って試してみましたか?フレームワークはあなたのために 'postData'をシリアル化する必要があります - おそらくあなたはそれを文字列にシリアライズしていますし、フレームワークは再び文字列をシリアライズしています、そして受信APIはあなたがJArrayではなく文字列として送信しているものを解釈するかもしれません。暗闇の中でただ一発。 –

+0

エラーが発生する** 'Newtonsoft.Json.Linq.JArray'から 'string'に変換できない** – nahaelem

答えて

0

答えはありませんが、提供したコードの詳細をご覧ください。あなたのStudents_CreateメソッドはStudentViewModels_Createのどこにでも呼び出されているようには見えません。これはStudentViewModels_Createの返された結果をに渡していると信じています。StudentViewModels_Createは空のJsonオブジェクト(return Json(""))を返します。

+0

StudentViewModels_CreateメソッドがAdd_studentページから呼び出されている。 APIに渡されるデータ – nahaelem

+0

StudentViewModelの定義方法を表示できますか?クラス宣言に必要な契約メタデータが不足している可能性があります。たとえば、組み込みの.Net 'DataContractJsonSerializer'では、' [DataContract] 'およ​​び' [DataMember] 'で宣言された後続のメンバーでクラスを宣言する必要があります。たぶんあなたの 'JavaScriptSerializer'には何か似たものが必要です。 – flamewave000

0

問題はJson Arrayにあります。 iはシリアライザ

 var serializer = new JavaScriptSerializer(); 
     var json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(postData); 
     var stringContent = new StringContent(json, Encoding.UTF8, "application/json"); 

     // pass the data to the api 
     System.Net.Http.HttpResponseMessage response = await client.PostAsync(baseUrl, stringContent); 

介してアレイを通過する際MVC符号セクション内のコードのこの部分は

 JArray postData = new JArray(); 
     //postData.Add(JsonConvert.SerializeObject(request)); 
     foreach(StudentViewModel student in studentviewmodels) 
     { 
      postData.Add(JsonConvert.SerializeObject(student)); 
     } 

のJSON varaibleは、空の配列を含有するので、APIに渡されるものは空の配列です。したがって、なぜ私は空の配列を取得していたのですか?

私は、JArrayではなくArrayListを試してからシリアライザに渡し、それがうまく機能するようにしました。私はこの問題がなぜ解決されたかについて100%確信していません。私はまだ具体的な理由で研究しています。

 ArrayList postData = new ArrayList(); 
     postData.Add(JsonConvert.SerializeObject(request)); 
     foreach (StudentViewModel student in studentviewmodels) 
     { 
      postData.Add(JsonConvert.SerializeObject(student)); 
     } 
関連する問題