nVe*_*lia 38 c# asp.net-web-api
我有一个具有必需属性的Model对象
public class ApiPing
{
[Required]
public DateTime ClientTime { get; set; }
public DateTime ServerTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有一个控制模型状态的Controller方法.
public IHttpActionResult Ping(ApiPing model)
{
if (!ModelState.IsValid)
return BadRequest(ModelState);
model.ServerTime = DateTime.UtcNow;
return Ok(model);
}
Run Code Online (Sandbox Code Playgroud)
如果我向action方法提交了一个正确的请求(带有模型),我会从ModeState.IsValid(true)中获得正确的值.但是,当我提交无效请求(没有模型,因此模型为null)时,我得到一个错误的ModelState.IsValid(也是true).
我可以简单地检查一下我的代码中的模型是否为null,但这有气味.这是一个预期的"功能"还是ModelState验证中的错误?难道我做错了什么 ?我期待太多了吗?
jul*_*nox 21
我以前遇到过同样的问题,答案已经在几个论坛中提供,甚至在SO:ModelState.IsValid,即使它不应该是?
您还可以添加自定义过滤器以验证(无效)缺少的字段和/或空值 http://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet -Web-API
Jos*_*Ch. 19
这是一个动作过滤器,用于检查空模型或无效模型.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
namespace Studio.Lms.TrackingServices.Filters
{
public class ValidateViewModelAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.ActionArguments.Any(kv => kv.Value == null)) {
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Arguments cannot be null");
}
if (actionContext.ModelState.IsValid == false) {
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在全球注册:
config.Filters.Add(new ValidateViewModelAttribute());
Run Code Online (Sandbox Code Playgroud)
或者在类/动作上按需使用它
[ValidateViewModel]
public class UsersController : ApiController
{ ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28045 次 |
| 最近记录: |