asp.net-web-api – 为什么我的ApiController方法的ModelState.IsValid失败,
|
我有一个ApiController方法接受几个参数,像这样: // POST api/files
public HttpResponseMessage UploadFile
(
FileDto fileDto,int? existingFileId,bool linkFromExistingFile,Guid? previousTrackingId
)
{
if (!ModelState.IsValid)
return Request.CreateResponse(HttpStatusCode.BadRequest);
...
}
当我POST到这个我把FileDto对象放在请求的正文中,并且查询字符串上的其他参数. 我已经发现我不能简单地省略可空参数 – 我需要把它们放在一个空值的查询字符串上.所以,当我不想为可空参数指定一个值时,我的查询看起来像这样: http://myserver/api/files?existingFileId=&linkFromExistingFile=true&previousTrackingId= 这与我的控制器方法相符,当执行该方法时,可空参数确实为空(如您所料). 但是,对ModelState.IsValid的调用返回false,当我检查错误时,它会抱怨两个可空参数. (模型的其他位没有错误).消息是:
为什么它认为需要/不存在价值?当然(a)一个值可以是空的,并且(b)一个值是(排序的)存在的 – 一个空的方式? 解决方法除了第一个答案之外,如果将所有可选项移动到方法声明的末尾,您应该能够使您的代码工作,允许省略前缀的url,并且我总是将其设置为NULL以获得良好的度量值:FileDto fileDto,Guid? previousTrackingId = null,int? existingFileId = null 但 好点re:一个带有前缀的空URL值…与NULL一样…考虑字符串,是?q =空字符串或空? 我试图找到框架中的确切逻辑(并继续看)引发了这些错误,但是在我的实验过程中,我发现直接在URL参数上指定了一个binder,似乎绕过了逻辑,并允许一个前缀后的空值没有模型绑定错误. 像这样: public class ValuesController : ApiController
{
// GET api/values
public IEnumerable<string> Get(
[FromUri(BinderType = typeof(TypeConverterModelBinder))] string q = null,[FromUri(BinderType = typeof(TypeConverterModelBinder))] int? value = null)
{
if (!ModelState.IsValid)
{
throw new HttpResponseException(HttpStatusCode.BadRequest);
}
return new string[] { value.HasValue ? value.Value.ToString() : "",q };
}
} (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-core – Asp.net Core中的UserHostAddress
- asp.net-mvc – 获取当前用户的角色
- ASP.NET MVC Url路由支持(点)
- asp.net – 我被困在UpdatePanel陷阱中
- asp.net – 在.NET 4.5中混合使用Windows和Forms身份验证:
- asp.net – 你可以从请求变量确定时区吗?
- asp.net – 元素’system.webServer’有无效的子元素’重写
- 从ASP.NET工作进程ID获取性能计数器实例名称(w3wp#XX)
- asp.net-web-api – WebApi2属性路由404
- asp.net-mvc – 强制剃刀不逃避网址
- asp.net-mvc – 如何使用Simple Injector装饰ASP
- asp.net-mvc – 使用ASP.NET身份重置密码时的令牌
- asp.net-web-api – 从响应中删除标题
- 一个简答的Access下的分页asp.net代码
- 这是一个bug?浮动操作被视为整数
- 剃刀 – 将MVC3应用程序迁移到MVC4:编译器错误消
- asp.net-mvc-3 – 如何防止ASP.NET MVC应用程序中
- 为什么要使用ASP.NET MVC 2进行REST服务?为什么
- asp.net – 单选按钮而不是下拉列表在mvc 3应用程
- asp.net-mvc-3 – Asp.net mvc 3-获取当前控制器
