如何解决如何在POST上绑定可选的querystring字符串参数
我在ASP.NET WebApi 2中具有以下控制器:
[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
参数必须位于查询字符串中,而不是窗体主体(窗体主体应为空)。因此,预期的API调用将为POST /Validate/Bsb?value=012345
。
一切正常,我得到了预期的结果;但是,有时我们会吸引客户使用POST /Validate/Bsb
或POST /Validate/Bsb?value=
调用API,这导致WebAPI本身产生400 Bad Request
响应,因为据我所知,该模型绑定程序无法将缺少的值绑定到参数。如果我在方法中放置一个断点,它将永远不会被击中。
因此,鉴于我无法更改API合同,我该如何处理这种情况?我曾尝试向参数添加[ValueProvider(typeof(RouteDataValueProviderFactory))]
属性,但我的缺失值测试用例仍然有效,但由于值不在路由中而是在查询字符串中,因此有效值测试用例中断了。>
更新
根据Craig H的建议,我向value
参数添加了默认值。因此,各种情况如下:
-
POST /Validate/Bsb?value=012345
-通过(有效值) -
POST /Validate/Bsb?value=000000
-通过(无效值) -
POST /Validate/Bsb?value=
-失败(空值) -
POST /Validate/Bsb
-通过(缺少值)
解决方法
您应该能够通过在方法签名中指定默认值来使参数成为可选参数。
例如
[HttpPost,Route("Bsb")]
public IHttpActionResult ValidateBsb(string value = null)
您的问题是,带有?value=
的查询抛出了错误的请求。
当我在本地尝试此操作时,命中了断点,而value
是null
。
如果我完全省略了QS参数,那么我收到了方法不允许的响应。
This page在属性路由中提到了可选的路由参数,尽管您没有在此处指定类似的参数。
我找不到描述关于路由和可选参数的其他选项的文档。我已经看到了一种表示在路由定义中将其定义为可选与在方法签名中将其定义为可选之间的区别。如果找到它,我将更新此答案!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。