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

时间:2017-09-16 05:36:16

标签: asp.net-web-api multipartform-data modelstate

我是使用asp net web api的新手。 我想在我的web api中创建UploadDocument功能。 所以,我创造了这种方式。

来自客户

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; }
}

模型

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

我的问题是,在控制器ModelState中总是为空。 我试图添加代码

var subj = new Subject<Event>();
var observable = Observable.Create<Event>(obs =>
{
    subj.Finally(obs.OnCompleted); 
    return subj.Subscribe(e =>
    {
        try
        {
            Preprocess(e);
            obs.OnNext(e);
            Postprocess(e);
        }
        catch (Exception ex) { obs.OnError(ex); }
    });
});

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

2 个答案:

答案 0 :(得分:1)

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

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

}

检查此答案:Custom DataAnnotation

答案 1 :(得分:0)

您的方法应如下所示:

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);
            }
        }
    }

我更喜欢在动作过滤器中传递一些验证,以使您的方法更清晰(尝试/捕获,模型状态)。

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