2017-04-05 10 views
1

私のコントローラ(.NET CORE MVC App)には、クライアントからデータが送信されたときにキャプチャする必要がある2つ以上の複雑なパラメータが必要です。状況に応じて、HTTP.GETまたはHTTP.POSTメソッドを使用して呼び出しを行いたいと思います。私はさまざまなアプローチを試しましたが、JObjectとのバインディングだけがうまくいきます。他のものはヌル値を持ちます。.Net Core複数の複合モデルのバインディングの問題

私は何が間違っているのかを知りたいと思っています。助言がありますか?

ここは私のコードです。

コントローラー:

[HttpPost] 
    public IActionResult GetDataPOST([FromBody]DataFilter dataFilter, [FromBody]SeriesFilter seriesFilter) 
    { 

     return Json(null); 
    } 

    [HttpPost] 
    public IActionResult GetDataPOSTjObject([FromBody]JObject stuff) 
    { 

     var content = stuff["dataFilter"].ToObject<DataFilter>(); 
     var content2 = stuff["seriesFilter"].ToObject<SeriesFilter>(); 

     return Json(null); 
    } 

    [HttpGet] 
    public IActionResult GetDataGET(DataFilter dataFilter, SeriesFilter seriesFilter) 
    { 


     return Json(null); 
    } 

モデル:

public class DataFilter 
{ 
    public string search { get; set; } 
} 

public class SeriesFilter 
{ 
    public string search { get; set; } 
} 

角度:

$scope.SubmitTimeSeriesFilter = function (options) { 

     options.search = "Search..."; 

     $http.get("@Url.Action("GetDataGET", "TimeSeries")", { params: { seriesFilter: options, dataFilter: options } }).success(function (rv) { 
      options.success(rv); 
     }); 

     $http.post("@Url.Action("GetDataPOST", "TimeSeries")", { seriesFilter: options, dataFilter: options }).success(function (rv) { 
      options.success(rv); 
     }); 

     $http.post("@Url.Action("GetDataPOSTjObject", "TimeSeries")", { seriesFilter: options, dataFilter: options }).success(function (rv) { 
      options.success(rv); 
     }); 

    }; 

答えて

0

あなたがこれを行うことはできません。 [FromBody]はデータストリーム全体を読み込み、要求ストリームはTCP/IP接続であるため、前方にのみ読み出すことができ、巻き戻しすることはできません(読み取り:1度しか読み取ることができません)。

このように、1つのアクションにつき1つの[FromBody]しか存在できません。複数のモデルを送信する場合は、両方の値を保持できるViewModelを作成する必要があります。

public class DataSeriesFilterViewModel 
{ 
    public DataFilter DataFilter { get; set; } 
    public SeriesFilter SeriesFilter { get; set; } 
} 

しかし、両方が文字列であることから、これらはスペースの無駄と思われるので、あなただけの

public class DataSeriesFilterViewModel 
{ 
    public string DataFilter { get; set; } 
    public string SeriesFilter { get; set; } 
} 

public IActionResult GetDataPOST([FromBody]DataSeriesFilterViewModel filter) 
{ 
    return Json(filter); 
} 
を行うことができます
関連する問題