2017-07-26 12 views
1

コンテンツモデルがapplication/jsonであるという要求を使用して、アクションモデルからインターフェイスモデルをバインドします。私は私のアクションメソッドで[FromBody]属性を使用しています。ASP.NET Core MVC - Model Binding:[FromBody](BodyModelBinder)という属性を使用してインターフェイスモデルをバインドします。

ComplexTypeModelBinderから派生したカスタムmodelBinderをこのリンク:Custom Model Binding in Asp.net Core, 3: Model Binding Interfacesで作成しようとしましたが、動作しません。私のモデルは常にnullです。その後、atribute [FromBody]を使用すると、BodyModelBinderが呼び出され、内部的にJsonInputFormatterが呼び出され、カスタムmodelBinderは使用されません。

私はインターフェイスモデルをバインドする方法を探しています。 MVC DIを使用して、各インタフェースをその実装とマッピングすることができます。私は私のインターフェイスでたmetadataType属性を使用して、別のソリューションを試みたが、それは名前空間System.ComponentModel.DataAnnotationsに存在しないと私はasp.netコアMVCのdoesnを読ん

public async Task<IActionResult> Create(IOperator user) 
    { 
     if (user == null) 
     { 
      return this.BadRequest("The user can't not be null"); 
     } 

     if (!this.ModelState.IsValid) 
     { 
      return this.BadRequest(this.ModelState); 
     } 

      IOperator op = await this.AuthenticationFrontService.CreateOperatorAsync(user.Login, user.Password, user.FirstName, user.LastName, user.ValidUntil, user.Role, user.Comment); 
     return new CreatedAtActionResult("Get", "operators", new { id = ((Operator)op).Id }, op); 
    } 

:私のアクションメソッドは次のように定義されこの属性を使用しないでくださいAsp.Net MVC MetaDataType Attribute not working。 ModelDataType属性を使用するために、ドメインモデルプロジェクトにmicrosoft.aspnetcore.mvc.dataannotationsパッケージをインストールしたくありません。

カスタムJsonInputFormaterを作成して別の解決策を試しました。つまり、JsonInputFormatterクラスを派生し、ソースコードを分析して、JsonSerializerが論理インターフェイスを逆シリアル化できないことがわかりました。だから私は解決策を探しています私はカスタムjsonserializerおそらくリゾルバまたは汎用コンバータを使用することができます。

ご協力いただきますようお願い申し上げます。

ありがとうございました。

答えて

0

インターフェイスを使用するのはC#メソッドでは問題ありませんが、MVCはアクションを呼び出すときにインスタンス化する具体的な型を知っている必要があります。どのタイプを使用するのかわからないので、Form/QueryString/etcの入力をバインドすることはできません。あなたの目標がそれをスリムに保つことであり、それをあなたのActionパラメータに設定し、それがうまくいくならインターフェイスIOperatorを実装するあなたの行動に使用するための非常に基本的なモデルを作成してください。

私はアクションでもインターフェイスを使用しようとしましたが、自分の検索で、バインドするインターフェイスの代わりにクラスを使用する以外に、動作させる方法が見つかりませんでした。

public class Operator : IOperator 
{ 
    //Implement interface 
} 

public async Task<IActionResult> Create(Operator user) 
{ 
    if (user == null) 
    { 
     return this.BadRequest("The user can't not be null"); 
    } 

    if (!this.ModelState.IsValid) 
    { 
     return this.BadRequest(this.ModelState); 
    } 

     IOperator op = await this.AuthenticationFrontService.CreateOperatorAsync(user.Login, user.Password, user.FirstName, user.LastName, user.ValidUntil, user.Role, user.Comment); 
    return new CreatedAtActionResult("Get", "operators", new { id = ((Operator)op).Id }, op); 
} 
関連する問題