【发布时间】:2014-01-18 16:52:49
【问题描述】:
我有一个这样的控制器操作:
public async Task<HttpResponseMessage> Put(
[FromUri] ResourceSpec resource,
//ValidationType? validationType,
CreateResourceRequest body)
public enum ValidationType
{
name = 1,
}
效果很好 - 资源对象和主体对象(类)分别由 URL 路由参数和请求主体填充。
我遇到的麻烦是将可选的validationType参数绑定到PUT请求中的查询字符串参数。
当我取消注释 ValidationType 行(并且验证类型是枚举)并发送带有 ?validationType=name 查询参数的 url 时,我收到错误路由到操作,例如405 方法不允许(允许:GET)(是的,我在这个控制器上有一个 GET 方法,不采用验证类型参数。)
是的,我已经尝试在路由代码中将参数设置为可选:
defaults: new { controller = "Resource", validationType = RouteParameter.Optional }
并尝试了
[FromUri] ValidationType? validationType,
变体。请告诉我为什么这不起作用!
更新:好的,我得到了它 route 但不是参数绑定。如果我引入一个新的“无”枚举成员并做
defaults: new { controller = "Resource", validationType = ValidationType.none }
然后我的行动将被调用。但是即使我的查询字符串有?validating=name,它总是会得到参数值ValidationType.none! [FromUri] 仍然没有区别。什么给了?
【问题讨论】:
-
目前无法验证,但我认为您还需要 ValidationType 上的 FromUri 属性。 PUT 的默认设置是绑定到请求正文而不是 URI。只有 GET 绑定到 URI,因为没有正文。查询字符串是 tje uri 的一部分。
-
我试过使用 [FromUri] 并没有什么区别。我也尝试过 GET,它似乎和 PUT 有同样的问题。
标签: asp.net-web-api model-binding optional-parameters query-parameters