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

Asp.net web api aspnet web api如何在多部分表单数据中使用modelstate进行验证?,asp.net-web-api,multipartform-data,modelstate,Asp.net Web Api,Multipartform Data,Modelstate,我是使用asp net web api的新手。 我想在我的web api中创建UploadDocument功能。 所以,我这样创造 来自客户 api.post('vendor/UploadDocument', formData, { headers: { 'Content-Type': 'multipart/form-data' } }) 控制器 public class VendorController : ApiController { [HttpPost] public

我是使用asp net web api的新手。 我想在我的web 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);
        }
    }
}
模型

我的问题是,在控制器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)


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

您的POST方法不包含模型,因此没有需要验证的内容。使您的方法
UploadDocument(UploadDocumentViewModel模型)
,它将与发布的值绑定(作为旁注,
int
不能
null
-默认情况下它是必需的,因此您的
[required]
属性是不必要的,除非您需要特定的错误消息),我尝试了您的解决方案,但从浏览器中得到一个错误:415(不支持的媒体类型),我使用多部分/表单数据发布数据,而不是json。看起来您的控制器对您传递的数据类型有另一种看法。您的“formData”是什么类型的?那是MultipartFormDataContent吗?那篇文章可能对你有帮助。你好,谢谢你的回复。我的“formData”使用的是javascript formData。。代码是这样的。设formData=new formData();formData.append(“field1”、“field1_值”);formData.append(“field2”、“field2_值”);formData.append(“文档”,选择文件);欢迎:)请批准回答,以便其他人受益
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);
            }
        }
    }