2017-04-05 5 views
1

Ich habe Aktionen in meinem Controller (.NET CORE MVC App), die zwei oder mehr komplexe Parameter, die erfasst werden sollte, wenn eine Daten von einem Client gebucht werden. Ich möchte den Aufruf mit einer HTTP.GET- oder HTTP.POST-Methode ausführen (abhängig von der Situation). Ich habe verschiedene Ansätze ausprobiert, aber nur die Bindung mit JObject funktioniert gut. Andere haben Nullwerte..Net Core Mehrere komplexe Modelle Bindung Problem

Ich bin bemüht herauszufinden, was ich falsch mache. Irgendwelche Vorschläge?

Hier ist mein Code.

Controller:

[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); 
    } 

Modelle:

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

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

Eckig:

$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); 
     }); 

    }; 

Antwort

0

Sie können dies nicht tun. [FromBody] liest den gesamten Datenstrom und da der Request Stream eine TCP/IP-Verbindung ist, kann er nur vorwärts lesen und kann nicht zurückgespult werden (gelesen: Er kann nur einmal gelesen werden).

Als solche können Sie nur eine einzige pro Aktion haben. Wenn Sie mehr als ein Modell senden möchten, müssen Sie ein ViewModel erstellen, das beide Werte enthalten kann.

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

Aber da beide Strings sind, scheint diese eine Verschwendung von Speicherplatz, so dass Sie tun können, nur

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

public IActionResult GetDataPOST([FromBody]DataSeriesFilterViewModel filter) 
{ 
    return Json(filter); 
}