2017-12-17 6 views
0

私は、プロジェクト内のapiでnullモデルを取得することについて問題があるので、何時間も後に混乱しています。MVC Ajaxからnullモデルを取得する

Javascriptを

問題について:

var data = new FormData(), 
    firstName = $('#FirstName').val(), 
    lastName = $('#LastName').val(); 
data.append("FirstName", firstName); 
data.append("LastName", lastName); 

     var ajaxRequest = $.ajax({ 
      type: "POST", 
      url: "/api/CRUD/AddPatient", 
      contentType: "application/json", 
      processData: false, 
      data: data, 
      success: function (xhr, data) { 
       alert(data); 
      }, 
      error: function (xhr, ajaxOptions, thrownError) { 
       //handle error 
      } 
     }); 

API

public string AddPatient(PatientBindingModel model) 
    { 
     try 
     { 
      PatientStore ps = new PatientStore(); 

      string ticks = DateTime.Now.Ticks.ToString(); 

      ps.Register(model); 

      return "success"; 
     } 
     catch (Exception ex) 
     { 
      string exMessage = ex.Message; 
      return exMessage; 
     } 
    } 

とAPIコントローラに渡されたモデルがまったくnullです!

誰でもご存知ですか? ありがとう

+0

これはMVCコントローラですか、ApiControllerですか?なぜあなたは 'FormData'オブジェクトを使用していますか? – Shyju

+0

@ShyjuコントローラはApiControllerです。私はデータを送信せず、私のビューにはフォームがないのでformDataを使用しています。 – Mehdi

+0

'PatientBindingModel'の定義は何ですか?正確に一致しない場合、バインドされません。パラメータを 'public string AddPatient(string FirstName、string LastName)'に設定した場合はどうなりますか?あなたのブラウザのネットワークタブは、POSTの本文として何を示していますか? –

答えて

0

「application/json」としてcontentTypeを指定している場合は、データプロパティの値はjsオブジェクトのJSON文字列化バージョンである必要があります。

これは動作するはずです。

var d = { FirstName: "Ross", LastName: "Geller" }; 

$.ajax({ 
    type: "POST", 
    url: "/api/CRUD/AddPatient", 
    contentType: "application/json", 
    data: JSON.stringify(d) 
}).done(function(data) { 
    console.log(data); 
}).fail(function(xhr, ajaxOptions, thrownError) { 
    alert(thrownError); 
}); 

$.ajax方法が要求Content-Typeヘッダとしてapplication/jsonで要求を送信します。モデルバインダーはこの要求ヘッダーを読み取り、読み取った値を基に要求本体または要求フォームデータなどから送信したデータを読み取ります

単純なフラットリーンビューモデルオブジェクトを送信する場合は、スキップできます明示的にcontentTypeヘッダーを指定し、jsオブジェクトをデータとして送信するだけです。この場合

var d = { FirstName: "Ross", LastName: "Geller" }; 
$.ajax({ 
    type: "POST", 
    url: "/api/CRUD/AddPatient", 
    data: d 
}).done(function (data) { 
    console.log(data); 
}).fail(function (xhr, ajaxOptions, thrownError) { 
    alert(thrownError); 
}); 

$.ajax方法が要求Content-Typeヘッダとしてapplication/x-www-form-urlencodedと要求を送信します。

今モデルバインダーがFirstNameLastNameあなたは通常、またテーブル

public class PatientBindingModel 
{ 
    public string FirstName { set; get; } 
    public string LastName { set; get; } 
} 

に設定されているプロパティであると仮定すると、あなたのメソッドのパラメータオブジェクトにPatientBindingModelオブジェクトをポストされたデータをマッピングすることができるようになりますWeb APIコントローラにHttpPostメソッドが1つしかなく、リクエストURLにメソッド名を指定する必要はありません。あなたは、単に/api/Customerような何かを行うことができますし、そのURLにHttpPostタイプの呼び出しを行う際に、フレームワークは[HttpPost]属性でマークされ、あなたの対応するメソッドへの呼び出しを指示する(よりRESTスタイルのリソースURLの)

クライアント側では、あなたのPatientBindingModelパラメータ

[HttpPost] 
public string AddPatient([FromBody] PatientBindingModel model) 
{ 
    ... 
} 

FromBody属性を追加

public class CustomerController : ApiController 
{ 
    [HttpPost] 
    public string AddPatient(PatientBindingModel model) 
    { 
     try 
     { 
      return "success : "+model.FirstName; 
     } 
     catch (Exception ex) 
     { 
      string exMessage = ex.Message; 
      return exMessage; 
     } 
    } 
} 
+0

多くのおかげで、両方のソリューションがテストされ、モデルがnullです。強く!私はこの問題が何か他のものだと思っています。私はこのプロジェクトと他のプロジェクトとの違いを見つけようとしています。 – Mehdi

+0

私はちょうど両方の方法をテストし、私のために働いています(Asp.net mvc5 app with web api 2 controllers)。もう一度比較し、欠けているものを見てください。また、[JSON POSTデータをオブジェクトとしてWeb APIメソッドに渡す方法についてはどうしますか?](https://stackoverflow.com/questions/20226169/how-to-pass-json-post-data-to-web- api-method-as-an-object) – Shyju

+0

このソリューションは、私のプロジェクトではうまく動作していませんが、何が欠けているか間違っているかを見つけなければならないと言いました。あなたの助けをありがとう:) – Mehdi

0

トゥルーはJSON.stringifyを使用してみてくださいとを指定しますとdataType

var ajaxRequest = $.ajax({ 
    type: "POST", 
    url: "/api/CRUD/AddPatient", 
    contentType: "application/json", 
    processData: false, 
    data: JSON.stringify(data), 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json' 
    success: function (xhr, data) { 
     alert(data); 
    }, 
    error: function (xhr, ajaxOptions, thrownError) { 
     //handle error 
    } 
}); 
+0

あなたのソリューションのおかげで、モデルは自分自身をヌルに強く保ちます:) – Mehdi

+0

私はクライアント側にいくつかの提案を追加しました。 –

+0

ありがとう – Mehdi

関連する問題