web-dev-qa-db-ja.com

「複数のパラメータをリクエストのコンテンツにバインドできません。」 WebAPIとAngularJsで

複数のパラメータがWebApiを渡すと、例外として発生します"Can't bind multiple parameter to the request's content."。次のコードの解決策があります

public class A1
{
   public int id {get;set;}
   public string name {get;set;}
}

public class A2
{
   public int id2 {get;set;}
   public string name2 {get;set;}
}

[Route("Save")]
[HttpPost]
public string Save([FromBody]A1 Emp, [FromBody]List<A2> EmpMarks)
{
}

JSファイル

$http({
    method: "post",
    url: "/api/Employee/Save",
    data: JSON.stringify({
        Emp: $scope.Emp,
        EmpMarks: $scope.EmpMarks
    })
}).then(function (response) {

}, function () {
    alert("Error Occur");
})
6
safeena rasak

データを含むモデルを使用することをお勧めします。

public class A1
{
    public int id { get; set; }
    public string name { get; set; }
}

public class A2
{
    public int id2 { get; set; }
    public string name2 { get; set; }
}

public class AModel 
{
    public A1 Emp { get; set; }
    public A2 EmpMarks { get; set; }
}


[Route("Save")]
[HttpPost]
public string Save(AModel aData)
{
    // ... your logic here
}
6
Lukas Kolletzki

[FromBody]属性を2回宣言しているため、問題が発生します。設計上、http POSTには本文が1つしかなく、[FromBody]は本文内のすべてのコンテンツを読み取り、指定されたオブジェクトに解析しようとします。

この問題を解決するには、リクエストの本文に添付されているクライアントオブジェクトと一致するオブジェクトを作成する必要があります。

public class RequestModel
{
    public A1 Emp {get;set;}
    public List<A2> EmpMarks {get;set;}
}

次に、postメソッドのリクエスト本文からそれをフェッチします

[Route("Save")]
[HttpPost]
public string Save([FromBody]RequestModel Emps)
5
Marcus Höglund
[Route("Save")]
[HttpPost]
public string Save(JObject EmpData)
{
dynamic json = EmpData;
A1 Emp=json.Emp.ToObject<A1>();
List<A2> EmpMarks=json.ToObject<List<A2>>();
}

それは別のオプションです。それは私のための仕事です

1
safeena rasak

POST呼び出しに複数のパラメーターを渡したい場合は、以下のようにして、サービスに一致する数だけ追加できます。

var data = new FormData();
data.append('Emp', $scope.Emp);
data.append('EmpMarks', $scope.EmpMarks);
$http.post('/api/Employee/Save', **data**, { 
  withCredentials : false,
  transformRequest : angular.identity,
  headers : {
            'Content-Type' : undefined
    }
  }).success(function(resp) { });
0
CrazyMac