2

我正在使用 asp.net web-api 并试图捕捉两种情况:

  1. 传递了未定义的 Uri 参数
  2. 传递了 Uri 参数的无效值

参数和值绑定成功,但是当名称或值无效时,不会发生异常并传递null。

更多详细信息:
ModelState.IsValid总是正确的
我已经清除了所有格式化程序 使用GlobalConfiguration.Configuration.Formatters.Clear(); 然后添加我继承的 XmlMediaTypeFormatter 设置XmlSerializer = true
此外,我正在为复杂类型使用模式生成的类(xsd 工具)

这是控制器方法签名:

public Messages GetMessages(int? startId = null, int? endId = null, DateTime? startDate = null, DateTime? endDate = null, int? messageType = null, string clientId = "", bool isCommentsIncluded = false)

有任何想法吗?

4

1 回答 1

2

创建一个类并装饰您希望验证的属性。例如(显然,使用您自己的值)

public class ModelViewModel
{
    public int Id { get; set; }
    [Required]
    public int RelationshipId { get; set; }
    [Required]
    public string ModelName { get; set; }
    [Required]
    public string ModelAttribute { get;set; }
}

创建一个过滤器,因此您不必在每个控制器中都使用 Model.IsValid。

public class ValidationFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var modelState = actionContext.ModelState;

        if (!modelState.IsValid)
            actionContext.Response = actionContext.Request
                 .CreateErrorResponse(HttpStatusCode.BadRequest, modelState);
    }
}

最后将以下内容添加到 Global.asax 中的 Application_Start()

GlobalConfiguration.Configuration.Filters.Add(new ValidationFilter());

希望这可以帮助。

更新

public Messages GetMessages([FromUri] ModelViewModel model)

您的模型类现在将绑定到 uri checkout this question中的值

于 2013-09-08T16:49:47.870 回答