aspnet web api 如何在多部分表单数据中使用 modelstate 进行验证?

aspnet web api how to validate using modelstate in multipart form data?

我是使用 asp 网络 api 的新手。 我想在我的网站 api 中创建 UploadDocument 功能。 所以,我这样创作。

来自客户

api.post('vendor/UploadDocument', formData, { headers: { 'Content-Type': 'multipart/form-data' } })

控制器

public class VendorController : ApiController {
    [HttpPost]
    public HttpResponseMessage UploadDocument()
    {
        try
        {
           if (!Request.Content.IsMimeMultipartContent())
           throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);

           var request = HttpContext.Current.Request;
           var model = new UploadDocumentViewModel();
           model.field1 = request.Form["field1"];
           model.field2 = request.Form["field2"];
           model.Document = request.Files["Document"];

           if (ModelState.IsValid)
           {
                return Request.CreateResponse(HttpStatusCode.OK);
           }
           else //ModelState is not valid
           {
                return Request.CreateResponse(HttpStatusCode.BadRequest);
           }
        }
        catch (Exception exception)
        {
           return Request.CreateResponse(HttpStatusCode.InternalServerError);
        }
    }
}

型号

public class UploadDocumentViewModel
{
    [Required]
    public string field1 { get; set; }

    [Required]
    public int field2 { get; set; }

    [Required]
    public HttpPostedFile Document { get; set; }
}

我的问题是,控制器中的 ModelState 始终为空。 我尝试添加代码

Validate(model);
if (ModelState.IsValid)...

但也没用。 有人可以知道在多部分表单数据中验证模型数据注释吗?

尝试在验证前清除模型状态

ModelState.Clear(); 
this.Validate(model); 
if (ModelState.IsValid) {

}

检查这个答案:

您的方法应如下所示:

public class VendorController : ApiController {

      [HttpPost]
        public IHttpActionResult UploadDocument(UploadDocumentViewModel viewModel)
        {
            try
            {
               if (!Request.Content.IsMimeMultipartContent())
return StatusCode(HttpStatusCode.UnsupportedMediaType);

               if (viewNodel == null)
                   return BadRequest("Model is empty");

               var field1 = viewModel.field1;
               var field2 = viewModel.field2;
               var documents = viewModel.document;

               if (ModelState.IsValid)
               {
                    return Ok();
               }
               else
               {
                    return BadRequest(ModelState);
               }
            }
            catch (Exception exception)
            {
               return InternalServerError(exception);
            }
        }
    }

我更喜欢在操作过滤器中传递其中一些验证,以使您的方法更清晰(try/catch,modelstate)。

如果您在模型绑定方面遇到一些问题,您可以实现您的自定义模型绑定器。