【问题标题】:How to call a Controller method which is accepting two models?如何调用接受两个模型的控制器方法?
【发布时间】:2014-11-11 09:49:13
【问题描述】:

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

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

注意两个[FromBody] 属性。

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

localhost/test/DoStuff/

发布数据:

<?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>

【问题讨论】:

  • FromBodyAttribute 在方法参数列表中只能使用一次。
  • 当负载很重时为什么要使用 XML?

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


【解决方案1】:

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

要解决此问题,您可以:

【讨论】:

  • 我对此还是很陌生,我正在尝试做与 OP 相同的事情。是否可以只传入两个模型并在请求正文中使用某种分隔符来分隔它们?
【解决方案2】:

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

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

【讨论】:

  • 并将类重命名为 MergedModelDto ;)
【解决方案3】:

我想说,与其用文档来证明缺乏对多种模型的支持,你应该从软件架构的角度找到一个论据: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)

【讨论】:

    【解决方案4】:

    您可以对 JSON 数据使用 stringify。

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

    当负载很重时为什么要使用 XML?

    【讨论】:

    • 这应该是一条评论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多