• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

Model Validation에 관해

21.06.09 18:12 작성 조회수 146

0

안녕하세요.

강의를 기초삼아 프로그램을 만들던 중 좀 애매한 부분이 있어서 질문 드리려 합니다.

모델 유호성검사에 관한 것인데요.

예를 들어

public class Student

{

    [Required(ErrorMessage = "나이를 입력해 주세요.")]

    pubblic int Age { get; set; }

}

위에서 처럼 int 타입에다가 Required를 먹인거에요.

그런데 이게... API를 호출할때 저 부분에 공백문자열이나 null을 주게되면 '나이를 입력해 주세요.'가 아니라

The JSON value could not be converted to System.Int32.

이런 형태의 에러가 발생하니다. 나는 어떻게든 ErrorMessage에 설정된 에러를 보여주고 싶은데 인터넷을 뒤져 몇가지 적용해 봤지만 뜻대로 잘 되지 않고 있습니다.

원하는 방향이 아예 안되는건지.. 아니면 무슨 방법이 있는건지..

해결할 수 있는 방법이 없는 걸까요..?

답변 2

·

답변을 작성해보세요.

0

anchor37님의 프로필

anchor37

질문자

2021.06.11

안녕하세요. 우선 답변 정말 감사드립니다.

현재는 Restful API를 만들고 있는데요. 그래서 View가 어떤 식으로 구성될지는 알 수 없습니다. 몇가지 시도를 해보니 null오는 오는 경우는 int? 로 하면 '[Required(ErrorMessage = "나이를 입력해 주세요.")]'설정이 먹히긴 합니다.

그런데 API를 호출할때

{"Age":""}

이런식으로 값을 넘겨버리면 ErrorMessage에서 설정한 오류 메세지가 아니라

The JSON value could not be converted to System.Int32.

이런 식으로 나와버린다는 거죠.

이게.. 틀린건 아닙니다만. 실무에 적용할때 사용자가 저 오류 메세지를 잘 인지를 못할것 같아서 ErrorMessage에 설정한 오류로 내신 낼 수 있는 방법을 찾아보려고 합니다.

그런데 쉽지가 않네요. 일단 저 오류가 나오는 시점 자체가 사용자의 요청이 Controller의 Action에 도달하기도 전에 나와버려요.

선생님께서 예제에 표시해주신 것처럼 Action에다가 AddModelError() 함수를 붙여서 해보려고 해도 여기까지 사용자의 요청이 도달해야 되는데 그 이전에 에러를 내면서 끊어버리니...

정말 방법이 없을까를 고민하고 있는데요.. 아직 까지는 답이 보이지 않네요...

0

anchor37님, 반갑습니다.

Age 멤버변수를 볼 때, 필수입력값에 기본값은 자동으로 0값이 주어지겠네요.

질문하신 내용을 볼 때, 원하시는 해결방법은 Age 값에 null이거나 공백문자열이 들어오지 않도록 하시는 것이 맞을 것 같습니다.

MVC 기준으로 설명드리겠습니다. 작동원리는 비슷하니까요.

1. Age 멤버변수에 다음과 같이 attribute를 추가해 주세요.

[Range(1, 100, ErrorMessage = "나이는 1~100세 입니다.")]

2. Controller 액션메서드를 다음과 같이 구성해 주세요.

Public IActionResult Create()

{

    return View(new Student());

}

[HttpPost]

[ValidateAntiForgeryToken]

public IActionResult Create(Student student)

{

        if (student.Age < 1 || student.Age > 100) {

            ModelState.AddModelError("", "나이를 올바르게 입력해 주세요.");

        }

        return View(student);

}

3. View는 다음과 같이 구성해 주세요.

View에서는 나이 선택 기본값을 "0"으로 합니다.

@model Models.Student

@{

    ViewData["Title"] = "등록화면";

}

<h1>@ViewData["Title"]</h1>

<h4>Student</h4>

<hr />

<div class="row">

    <div class="col-md-4">

        <form asp-action="Create">

            <div asp-validation-summary="ModelOnly" class="text-danger"></div>

            <div class="form-group">

                <label asp-for="Age" class="control-label"></label>

                <select asp-for="Age" class="form-control">

                    <option value="0">== 나이 선택 ==</option>

                    <option value="10">10세</option>

                    <option value="20">20세</option>

                    <option value="30">30세</option>

                    <option value="40">40세</option>

                    <option value="50">50세</option>

                </select>

                <span asp-validation-for="Age" class="text-danger"></span>

            </div>

            <div class="form-group">

                <input type="submit" value="Create" class="btn btn-primary" />

            </div>

        </form>

    </div>

</div>

참고로, 캡처화면도 추가합니다.