如何调用接受两个模型的Controller方法?

时间:2014-09-17 11:22:33

标签: c# .net asp.net-mvc asp.net-web-api

如果我们的API控制器具有如下方法,那么这似乎是完全有效的:

[HttpPost] 
public IHttpActionResult DoStuff([FromBody]ModelA modelA, [FromBody]ModelB modelB)

请注意两个[FromBody]属性。

问题是,如何调用这样的方法?

localhost/test/DoStuff/

POST数据:

<?xml version="1.0"?>
<ModelA>
 ...
</ModelA>
<ModelB>
 ...
</ModelB>

似乎没有得到承认。有什么想法吗?

编辑:错误数据如下:

<?xml version="1.0"?>
<Error>
  <Message>An error has occurred.</Message>
  <ExceptionMessage>Can't bind multiple parameters ('model1' and 'model2') to the request's content.
  </ExceptionMessage>
</Error>

4 个答案:

答案 0 :(得分:6)

我想说的是,不应该证明这个缺乏对多个模型的支持的文档,你应该从软件架构的角度来看一个论点:ASP.NET Web API是建立在< em> MVC 范例,其中视图绑定到模型并由控制器处理。

换句话说:1个模型,1个视图,1个控制器。

您的用例不应该使用2个模型解决,而是使用 DTO 。不是将2个参数绑定到2个模型,而是设计一个DTO,其中包括两个模型作为整个DTO的关联:

// You don't need [FromBody] since complex types are already taken
// from the request body
public IHttpActionResult DoStuff(SomeDto dto)

答案 1 :(得分:4)

创建一个ViewModel,它由两个模型组成,并在控制器中用作单个模型。

public class MergedModel
{
    public ModelA A{get; set;}
    public ModelB B{get; set;}
}

答案 2 :(得分:3)

你做不到。默认参数绑定在使用属性FromBody时使用整个主体,而不仅仅是其中的一部分。因此只有一个FromBody可以使用。

要解决此问题,您可以:

答案 3 :(得分:2)

您可以将stringify用于JSON数据。

 JSON.stringify({ ModelA: o, ModelB: a}),

为什么在使有效负载变重时使用XML?