Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何调用接受两个模型的控制器方法?_C#_.net_Asp.net Mvc_Asp.net Web Api - Fatal编程技术网

C# 如何调用接受两个模型的控制器方法?

C# 如何调用接受两个模型的控制器方法?,c#,.net,asp.net-mvc,asp.net-web-api,C#,.net,Asp.net Mvc,Asp.net Web Api,如果我们有一个API控制器,其方法如下所示,那么它似乎非常有效: [HttpPost] public IHttpActionResult DoStuff([FromBody]ModelA modelA, [FromBody]ModelB modelB) <?xml version="1.0"?> <Error> <Message>An error has occurred.</Message> <ExceptionMessage&

如果我们有一个API控制器,其方法如下所示,那么它似乎非常有效:

[HttpPost] 
public IHttpActionResult DoStuff([FromBody]ModelA modelA, [FromBody]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>
请注意两个
[FromBody]
属性

问题是,如何调用这种方法

localhost/test/DoStuff/
发布数据:

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

...
...
似乎没有被认出来。你知道为什么吗

编辑:错误数据如下所示:

[HttpPost] 
public IHttpActionResult DoStuff([FromBody]ModelA modelA, [FromBody]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>

发生了一个错误。
无法将多个参数(“model1”和“model2”)绑定到请求的内容。

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

要解决此问题,您可以:

  • 读取主体并将其拆分为两个模型
  • 传入一个包装器模型

创建一个包含两个模型的ViewModel,并将其用作控制器中的单个模型

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

我想说的是,与其用文档来证明缺乏对多个模型的支持,不如从软件体系结构的角度来论证:ASP.NET Web API构建在MVC范例之上,在MVC范例中,视图绑定到模型并由控制器处理

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

您的用例不应该使用两个模型来解决,而是使用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)

您可以对JSON数据使用stringify

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

为什么在使负载沉重时使用XML?

FromBodyAttribute
只能在方法参数列表中使用一次。为什么在使负载沉重时使用XML?并将类重命名为MergedModelTo;)这应该是一个注释我对这个还是很陌生的,我试着做与OP相同的事情。是否可以只传入两个模型,并在请求体中使用某种分隔符来分隔它们?