Asp.net web api aspnet web api如何在多部分表单数据中使用modelstate进行验证?
我是使用asp net web api的新手。 我想在我的web api中创建UploadDocument功能。 所以,我这样创造 来自客户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
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);
}
}
}