【问题标题】:WebApi not binding to (reasonably) simple modelWebApi 未绑定到(合理的)简单模型
【发布时间】:2013-08-06 07:10:45
【问题描述】:

冒着提出菜鸟问题的风险,我正在尝试测试一个 url 以发布到它应该绑定模型的 webapi 端点,这是 MVC:

    public ReturnModel GetSomeInformation( ValidationPackage validationPackage)
    {
        return new ReturnModel();
    }

ValidationPackage 类似于:

public class ValidationPackage : BaseValidationPackage
{
    [DataMember]
    public int ClubId { get; set; }
}

因此,当我只是尝试为需要它的 iOS 用户测试或演示它时,以下内容不会绑定:

http://[本地]/api/meet/GetInformation?ClubId=152

我是否应该将方法签名更改为这个,然后一切正常:

public ReturnModel GetSomeInformation( int clubId) {...}

但不知何故,我觉得我的第一个版本应该可以工作,但我做错了什么,因为我觉得 webapi 只是 MVC 的一个实现。

【问题讨论】:

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


    【解决方案1】:

    MVC(和 Web API)简单类型(stringintGuid 等)中模型绑定的默认行为是从查询字符串绑定的。另一方面,对象将使用请求的主体进行绑定。您可以使用FromBodyAttributeFromUriAttribute(取决于您的需要)在每个参数的基础上更改此行为:

    public ReturnModel GetSomeInformation([FromUri]ValidationPackage validationPackage)
    {
        return new ReturnModel();
    }
    

    【讨论】:

      【解决方案2】:

      默认情况下,Web API 会将查询字符串参数绑定到原始类型,并将请求正文内容绑定到复杂类型

      模型绑定器在请求正文中需要一个 ValidationPackage 对象,但您在查询字符串中传递了一个原语。

      您可以将以下内容作为您的帖子正文:

      {
        "ClubId": 152
      }
      

      如果您需要在查询字符串中传递它,您需要使用[FromUri] 属性覆盖默认行为:

      public ReturnModel GetSomeInformation([FromUri] ValidationPackage validationPackage)
      {
          return new ReturnModel();
      }
      

      有更多关于Web Api here的参数绑定功能的信息,你可以找到一个类似的问题here

      【讨论】:

      • 是的,我已经尝试过了,但没有用...澄清一下,我并不疯狂,一旦我做对了,它应该绑定到更复杂的对象?
      • 在我的测试中一切正常,但我真的很想看到它通过 URL 工作......我不一定希望调用这些的 iOS 开发人员担心知道 ClubId 住在验证包
      • 据我所知,如果您有 [FromUri] 属性,它应该可以工作。如果设置断点,模型通过什么,它只是空吗?
      • 我刚刚意识到我在其他地方做了一些愚蠢的事情,FromUri 确实有效,但我上次没有正确调试它...感谢您的帮助...
      猜你喜欢
      • 1970-01-01
      • 2013-03-09
      • 2013-04-28
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      相关资源
      最近更新 更多