.Net Core Multiple Complex模型绑定问题

时间:2017-04-05 06:43:18

标签: angularjs asp.net-core

我在我的控制器(.NET CORE MVC应用程序)中执行操作,该操作需要从客户端发布数据时应捕获的两个或更多复杂参数。我想用HTTP.GET或HTTP.POST方法执行调用(取决于具体情况)。我尝试了不同的方法,但只与JObject绑定工作正常。其他人有空值。

我正在努力找出我做错了什么。有什么建议吗?

这是我的代码。

控制器:

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

    };

1 个答案:

答案 0 :(得分:0)

你不能这样做。 [FromBody]读取整个数据流,并且由于请求流是TCP / IP连接,因此它只能向前读取而不能被重新读取(读取:它只能读取一次)。

因此,每次操作只能有一个[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);
}