首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在POST上绑定可选的querystring参数

如何在POST上绑定可选的querystring参数
EN

Stack Overflow用户
提问于 2020-09-20 23:05:57
回答 1查看 33关注 0票数 0

在ASP.NET WebApi 2中有以下控制器:

代码语言:javascript
运行
复制
[RoutePrefix("Validations")]
public partial class ValidationsController
{
  [HttpPost, Route("Bsb")]
  public IHttpActionResult ValidateBsb(string value)
  {
    var validator = new BankStateBranchValidator(DbContext.BankStateBranches);
    var data = new ValidationsResult
    {
      IsValid = validator.IsValid(value ?? string.Empty)
    };

    data.Error = data.IsValid
      ? null
      : "The BSB you have entered does not appear to be valid. Please check the value and try again.";

    return Ok(data);
  }
}

由于历史原因,value参数需要位于querystring中,而不是应该为空的表单主体中。因此,预期的API调用将是POST /Validate/Bsb?value=012345

这一切都很好,而且我得到了预期的结果;但是,有时我们让客户端用POST /Validate/BsbPOST /Validate/Bsb?value=调用API,这将导致来自WebAPI本身的400 Bad Request响应,因为据我所知,模型绑定器未能将缺失的值绑定到参数。如果我在方法中放置一个断点,它就永远不会被击中。

因此,考虑到我无法更改API契约,我如何处理这个场景?我尝试将一个[ValueProvider(typeof(RouteDataValueProviderFactory))]属性添加到参数中,而我对缺失值的测试用例可以工作,但是有效值测试用例会中断,因为值不在路由中,而是在查询字符串中。

更新

根据Craig的建议,我向value参数添加了一个默认值。因此,各种情况是:

  • POST /Validate/Bsb?value=012345 -通行证(有效值)
  • POST /Validate/Bsb?value=000000 -传递(无效值)
  • POST /Validate/Bsb?value= -失败(空值)
  • POST /Validate/Bsb - pass (缺失值)
EN

回答 1

Stack Overflow用户

发布于 2020-09-25 15:47:47

通过在方法签名中指定默认值,您应该能够使参数成为可选的。

例如:

代码语言:javascript
运行
复制
[HttpPost, Route("Bsb")]
public IHttpActionResult ValidateBsb(string value = null)

您的问题是,使用?value=的查询抛出了一个错误的请求。

当我在本地尝试时,我的断点被击中,valuenull

如果我完全忽略了QS参数,那么我收到了一个不允许响应的方法。

此页提到了带有属性路由的可选路由参数,尽管您没有在这里指定这样的参数。

我找不到描述有关路由和可选参数的其他选项的文档。我看到了一种方法,它表明在路由定义中将其定义为可选与在方法签名中将其定义为可选之间的区别。如果我找到了,我会更新这个答案!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63984446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档