[c#] ASP.NET Web API에서 ModelState 유효성 검사 처리

ASP.NET Web API로 모델 유효성 검사를 수행하는 방법이 궁금합니다. 내 모델은 다음과 같습니다.

public class Enquiry
{
    [Key]
    public int EnquiryId { get; set; }
    [Required]
    public DateTime EnquiryDate { get; set; }
    [Required]
    public string CustomerAccountNumber { get; set; }
    [Required]
    public string ContactName { get; set; }
}

그런 다음 API 컨트롤러에 Post 작업이 있습니다.

public void Post(Enquiry enquiry)
{
    enquiry.EnquiryDate = DateTime.Now;
    context.DaybookEnquiries.Add(enquiry);
    context.SaveChanges();
}

if(ModelState.IsValid)사용자에게 전달할 오류 메시지를 추가 하고 처리하려면 어떻게해야 합니까?



답변

우려 사항을 분리하기 위해 모델 유효성 검사를 위해 작업 필터를 사용하는 것이 좋습니다. 따라서 API 컨트롤러에서 유효성 검사를 수행하는 방법에 크게 신경 쓸 필요가 없습니다.

using System.Net;
using System.Net.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;

namespace System.Web.Http.Filters
{
    public class ValidationActionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            var modelState = actionContext.ModelState;

            if (!modelState.IsValid)
                actionContext.Response = actionContext.Request
                     .CreateErrorResponse(HttpStatusCode.BadRequest, modelState);
        }
    }
}


답변

당신이 찾고 있던 것이 아닐 수도 있지만, 누군가가 알기에 좋은 것일 수도 있습니다.

.net Web Api 2를 사용하는 경우 다음을 수행 할 수 있습니다.

if (!ModelState.IsValid)
     return BadRequest(ModelState);

모델 오류에 따라 다음 결과가 표시됩니다.

{
   Message: "The request is invalid."
   ModelState: {
       model.PropertyA: [
            "The PropertyA field is required."
       ],
       model.PropertyB: [
             "The PropertyB field is required."
       ]
   }
}


답변

예를 들면 다음과 같습니다.

public HttpResponseMessage Post(Person person)
{
    if (ModelState.IsValid)
    {
        PersonDB.Add(person);
        return Request.CreateResponse(HttpStatusCode.Created, person);
    }
    else
    {
        // the code below should probably be refactored into a GetModelErrors
        // method on your BaseApiController or something like that

        var errors = new List<string>();
        foreach (var state in ModelState)
        {
            foreach (var error in state.Value.Errors)
            {
                errors.Add(error.ErrorMessage);
            }
        }
        return Request.CreateResponse(HttpStatusCode.Forbidden, errors);
    }
}

이렇게하면 다음과 같은 응답이 반환됩니다 (JSON을 가정하지만 XML의 기본 원칙은 동일 함).

HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
(some headers removed here)

["A value is required.","The field First is required.","Some custom errorm essage."]

물론 필드 이름, 필드 ID 등을 추가하는 등 원하는 방식으로 오류 개체 / 목록을 구성 할 수 있습니다.

새 엔티티의 POST와 같은 “단방향”Ajax 호출 인 경우에도 호출자에게 요청이 성공했는지 여부를 나타내는 무언가를 반환해야합니다. 사용자가 AJAX POST 요청을 통해 자신에 대한 정보를 추가하는 사이트를 상상해보십시오. 입력하려는 정보가 유효하지 않은 경우 어떻게하면 저장 작업이 성공했는지 여부를 어떻게 알 수 있습니까?

이 작업을 수행하는 가장 좋은 방법은 사용하는 좋은 올드 HTTP 상태 코드를 같은 200 OK등등. 이렇게하면 JavaScript가 올바른 콜백 (오류, 성공 등)을 사용하여 실패를 올바르게 처리 할 수 ​​있습니다.

다음은 ActionFilter 및 jQuery를 사용하는이 방법의 고급 버전에 대한 멋진 자습서입니다. http://asp.net/web-api/videos/getting-started/custom-validation


답변


답변

또는 앱에 대한 간단한 오류 모음을 찾고 있다면 여기에 구현 된 내용이 있습니다.

public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var modelState = actionContext.ModelState;

        if (!modelState.IsValid)
        {

            var errors = new List<string>();
            foreach (var state in modelState)
            {
                foreach (var error in state.Value.Errors)
                {
                    errors.Add(error.ErrorMessage);
                }
            }

            var response = new { errors = errors };

            actionContext.Response = actionContext.Request
                .CreateResponse(HttpStatusCode.BadRequest, response, JsonMediaTypeFormatter.DefaultMediaType);
        }
    }

오류 메시지 응답은 다음과 같습니다.

{
  "errors": [
    "Please enter a valid phone number (7+ more digits)",
    "Please enter a valid e-mail address"
  ]
}

답변

startup.cs 파일에 아래 코드 추가

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2).ConfigureApiBehaviorOptions(options =>
            {
                options.InvalidModelStateResponseFactory = (context) =>
                {
                    var errors = context.ModelState.Values.SelectMany(x => x.Errors.Select(p => new ErrorModel()
                   {
                       ErrorCode = ((int)HttpStatusCode.BadRequest).ToString(CultureInfo.CurrentCulture),
                        ErrorMessage = p.ErrorMessage,
                        ServerErrorMessage = string.Empty
                    })).ToList();
                    var result = new BaseResponse
                    {
                        Error = errors,
                        ResponseCode = (int)HttpStatusCode.BadRequest,
                        ResponseMessage = ResponseMessageConstants.VALIDATIONFAIL,

                    };
                    return new BadRequestObjectResult(result);
                };
           });


답변

여기에서 모델 상태 오류를 하나씩 확인할 수 있습니다.

 public HttpResponseMessage CertificateUpload(employeeModel emp)
    {
        if (!ModelState.IsValid)
        {
            string errordetails = "";
            var errors = new List<string>();
            foreach (var state in ModelState)
            {
                foreach (var error in state.Value.Errors)
                {
                    string p = error.ErrorMessage;
                    errordetails = errordetails + error.ErrorMessage;

                }
            }
            Dictionary<string, object> dict = new Dictionary<string, object>();



            dict.Add("error", errordetails);
            return Request.CreateResponse(HttpStatusCode.BadRequest, dict);


        }
        else
        {
      //do something
        }
        }

}