我在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
参数需要在querystring中,而不是表单体中,表单体应该为空。因此,预期的API调用将是POST /Validate/Bsb?value=012345
。
这一切都很好,我得到了预期的结果;然而,有时我们会让客户端使用POST /Validate/Bsb
或POST /Validate/Bsb?value=
调用API,这会导致WebAPI本身产生400 Bad Request
响应,因为据我所知,模型绑定器无法将缺失的值绑定到参数。如果我在方法中放入一个断点,它永远不会被命中。
因此,鉴于我无法更改API合同,我如何处理这种情况?我已经尝试将[ValueProvider(typeof(RouteDataValueProviderFactory))]
属性添加到参数中,并且我对丢失值的测试用例有效,但随后有效值测试用例中断,因为该值不在路由中,而是在querystring中。
更新
根据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参数,那么我收到了一个方法不允许的响应。
本页提到了具有属性路由的可选路由参数,尽管您没有在此处指定这样的参数。
我找不到描述有关路由和可选参数的其他选项的文档。我看到了一个例子,它指出了在路由定义中将它定义为可选和在方法签名中将其定义为可选之间的区别。如果我找到了,我会更新这个答案!