将多个对象作为参数传递给mvc 6动作

Yuv*_*man 4 c# asp.net-mvc asp.net-core-mvc .net-core

我有一个工作正常的MVC 5项目,我需要将该项目迁移到带有.NET核心的MVC 6.在设法调整所有工作之后,我遇到了一个问题:我的许多操作都接受了多个对象作为参数.模型绑定器MVC 5正在使用没有问题,但MVC 6似乎在这些操作的所有参数中都置零,我想这是MVC和WebAPI统一的一部分.我的问题是,如果它周围没有添加另一个请求包装器对象的模型库.

例如:

    [HttpPost]
    public ActionResult GetVersionData(OvlEnvironment environment, Pipeline pipeline)
    {
        BL.SetEnviromentVersion(pipeline, environment);
        return PartialView("_Version", environment);
    }
Run Code Online (Sandbox Code Playgroud)

在mvc 5项目中,ajax请求包含表单中的json数据

{ "environment" : {*Data...*},
  "pipeline" : {*Data...*}
}
Run Code Online (Sandbox Code Playgroud)

被接受了.在mvc 6中,响应同一请求的两个对象看起来都是null.
谢谢

Ral*_*ing 5

您必须为ASP.NET Core MVC Framework提供提示,即绑定到模型的数据可以在post请求的主体中找到.这是通过[FromBody]属性完成的.

[FromBody]:使用配置的格式化程序绑定请求正文中的数据.根据请求的内容类型选择格式化程序.

通过设计是不可能的,因为它被描述为多个参数绑定到一个JSON源此处.为了避免使用其他模型类,您可以使用这样的通用JObject:

[HttpPost]
public ActionResult GetVersionData([FromBody] JObject data)
{
    var environment = data["environment"].ToObject<OvlEnvironment>();
    var pipline = data["pipeline"].ToObject<Pipeline>();

    BL.SetEnviromentVersion(pipeline, environment);
    return PartialView("_Version", environment);
}
Run Code Online (Sandbox Code Playgroud)