2017-09-19 5 views
0

人。私はasp .netコアコントローラのjson転送に関する質問をしたいだけです。唯一存在しない場合には、asp.netのコアでjsonを受け取るために各コントローラに新しいオブジェクトクラスを作成する必要がありますか?

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

public class PersonController : ApiController 
{ 
    [HttpPost] 
    public Person Index([FromBody]Person person) 
    { 
     return person; 
    } 
} 

しかし:

私はrequest.bodyから

{ 
FirstName: "Zhen", 
LastName: "Wang" 
} 

のようなJSONを読みたい場合、私は知っているが、私のようなオブジェクトにこれをバインドする必要があります以下のようなJSONでの人が、また、ビル:

{ 
     Person: { 
     FirstName: "Zhen", 
     LastName: "Wang" 
     }, 
     Building:{ 
     Address:"Willis Street" 
     } 
    } 

は、私は人とbuildinをreciveするPersonAndBuildingを構築する必要がありますrequest.bodyのgデータ?

public class PersonAndBuilding 
{ 
    public Person Person { get; set; } 
    public Building Building { get; set; } 
} 

public class PersonController : ApiController 
{ 
    [HttpPost] 
    public Person Index([FromBody]PersonAndBuilding personAndBuilding) 
    { 
     return personAndBuilding.Person; 
    } 
} 

これは私のプログラムの各POSTコントローラ用に新しいクラスを作成する必要があるため、これは奇妙だと思います。

誰か教えていただけますか?

+0

しかし、あなたは単なる 'Person'プロパティで親クラスを作成することができます。親クラス名は重要ではありません。 'Building'クラス/プロパティをすべて一緒に除外します。 –

+0

あなたはどのようにjsonを送信していますか?どういう意味ですか? –

答えて

0

いいえ、あなたはこれを行うことができます。

public class PersonController : ApiController 
{ 
    [HttpPost] 
    public Person Index(Person Person, Building Building) 
    { 
     return Person; 
    } 
} 

それはあなたがあまりにもそれを渡す前に、あなたはJSONをシリアライズ方法によって異なります。

+2

[FromBody属性は1つしか持てません](https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding#binding-formatted-data-from-the-request-body ) –

+0

私はこれを試しました。それは動作していません。私が正しいかどうかは分かりません。また、たとえパラメータPersonが1つだけでも[frombody]なしでは機能しません。 –

+0

どのように正確にデータを渡していますか? –

0

POSTのデータはa few waysのいずれかに転送されますが、Body/FormまたはURL(またはその両方)が最も一般的ですが、リクエスト本体の内容は、通常、1回だけ読み取ることができます。これは、パラメータごとに1つのFromBody属性を持つことができる理由です。

WebAPIとの間でデータを送受信するときは、DTO(データ転送オブジェクト)を使用するのが一般的です。 DTOは、不必要なデータベースの迷惑メールや、公開したくない/公開したくないフィールドを使わずに、必要なだけ正確にデータを処理する責任があります。

このシナリオでは、はい、具体的に1つのビルディングと1人のPersonを含むクラスが必要です。簡単にするために、同じクラス/ファイル内でDTOを定義するか、より洗練された組織化されたソリューションのためにDTOを./DTOs/または./Models/DTOs/で定義することができます。

あなたの人物オブジェクトがIdによって識別されるようにREST構造体を変更して、あなたのルートが/api/Person/{personId}のように見えるようにしてください。あなたのメソッドのシグネチャは、次のようなものになります。

[HttpPost("{personId}")] 
public IActionResult Index([FromBody] Building building, [FromRoute] int personId) { 
    var person = ctx.Persons.Single(p => p.Id == personId); 
    //you have a building and person. 
} 
関連する問題