当前位置: 首页 > 知识库问答 >
问题:

正在验证ASP.NET Web API模型绑定器中的参数

公良鸿禧
2023-03-14

我为我的模型定制了一个 :

public class MyBinder : IModelBinder {

public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) {
        // bla-bla-bla

        bindingContext.ModelState.AddModelError(
            bindingContext.ModelName, "Request value is invalid.");
        return false;
    }
}

我希望当在请求中传递无效值时,HTTP400错误请求将自动返回。然而,这种情况并不发生。如果存在任何绑定错误,应该怎样做才能使Web API返回HTTP400?

共有2个答案

许庆
2023-03-14

在控制器中返回它:

if (!ModelState.IsValid)
{
    return new HttpResponseMessage(HttpStatusCode.BadRequest);
}
丌官运珧
2023-03-14

null

public sealed class BadRequestIfModelNotValidAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
  /// <summary>
  /// if the modelstate is not valid before invoking the action return badrequest
  /// </summary>
  /// <param name="actionContext"></param>
  public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
  {
    var modelState = actionContext.ModelState;
    if (!modelState.IsValid)
      actionContext.Response = generateModelStateBadRequestResponse(modelState, actionContext.Request);

    base.OnActionExecuting(actionContext);//let other filters run if required
  }

  /// <summary>
  /// if the action has done additional modelstate checks which made it invalid we are going to replace the response with a badrequest
  /// </summary>
  /// <param name="actionExecutedContext"></param>
  public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
  {
    var modelState = actionExecutedContext.ActionContext.ModelState;
    if (!modelState.IsValid)
      actionExecutedContext.Response = generateModelStateBadRequestResponse(modelState, actionExecutedContext.Request);

    base.OnActionExecuted(actionExecutedContext);
  }

  private HttpResponseMessage generateModelStateBadRequestResponse(IEnumerable<KeyValuePair<string, ModelState>> modelState, HttpRequestMessage request)
  {
    var errors = modelState
      .Where(s => s.Value.Errors.Count > 0)
      .Select(s => new ApiErrorMessage {
          Parameter = s.Key,
          Message = getErrorMessage(s.Value.Errors.First())
        }) //custom class to normalize error responses from api
        .ToList();

    return request.CreateResponse(System.Net.HttpStatusCode.BadRequest, new ApiError
    {
      ExceptionType = typeof(ArgumentException).FullName,
      Messages = errors
    });
  }

  /// <summary>
  /// retrieve the error message or fallback to exception if possible
  /// </summary>
  /// <param name="modelError"></param>
  /// <returns></returns>
  private static string getErrorMessage(ModelError modelError)
  {
    if(!string.IsNullOrWhiteSpace(modelError.ErrorMessage))
      return modelError.ErrorMessage;

    if(modelError.Exception != null)
      return modelError.Exception.Message;

    return "unspecified error";
  }
}
 类似资料:
  • 我是asp的新手。NETWebAPI,在asp。net web api,我如何让它为操作自动绑定多个参数,如下所示。 在一个html页面中,我使用jQueryAjax将数据发布到api,得到了一个404ERORR 我只是更改了默认路线 默认值: 改变:

  • 我正在用Web API5构建Web服务。我正在通过扩展IModelBinder接口来实现自定义模型绑定器,以将复杂类型映射为操作的参数。装订部分工作正常。但不会进行模型验证。ModelState.IsValid始终为true。 如果我显式调用Validate()或使用[FromUri]属性,则ModelState.isValid设置正确。 我应该在模型绑定器内实现验证部分。如果是,我应该如何实现?

  • Enforce模块用于验证数据。对于使用以前的验证器的用户,还可以继续使用,它们中的一部分整合到了enforce,剩余部分还没有。推荐你开始使用orm.enforce来取代orm.validators。可用的验证器的列表请见node-enforce。 unique验证器也构建于ORM中,可以这样来访问: name: orm.enforce.unique("name already taken!")

  • 这个问题已经被问了很多次了,即使是在经历了所有的解决方案之后,我也无法让hibernate validator工作。 控制器类:- servlet-上下文:- 依赖关系:- 验证类:- 我错过了什么?

  • 中间件 binding 为 Macaron 实例 提供了请求数据绑定与验证的功能。 GitHub API 文档 下载安装 go get github.com/go-macaron/binding 使用示例 获取表单数据 假设您有一个联系人信息的表单,其中姓名和信息为必填字段,则我们可以使用如下结构来进行表示: type ContactForm struct { Name

  • 本文向大家介绍asp.net core系列之模型绑定和验证方法,包括了asp.net core系列之模型绑定和验证方法的使用技巧和注意事项,需要的朋友参考一下 一. 模型绑定 ASP.NET Core MVC 中的模型绑定,是将 HTTP 请求中的数据映射到 action方法参数。   这些参数可能是简单类型的参数,如字符串、整数或浮点数,也可能是复杂类型的参数。  当 MVC 收到 HTTP 请