programing

ModelState인 경우 오류 메시지가 표시됩니다.유효성이 실패합니까?

muds 2023. 4. 26. 23:49
반응형

ModelState인 경우 오류 메시지가 표시됩니다.유효성이 실패합니까?

제 컨트롤러에 이 기능이 있습니다.

[HttpPost]
public ActionResult Edit(EmployeesViewModel viewModel)
{
    Employee employee = GetEmployee(viewModel.EmployeeId);
    TryUpdateModel(employee);

    if (ModelState.IsValid)
    {
        SaveEmployee(employee);
        TempData["message"] = "Employee has been saved.";
        return RedirectToAction("Details", new { id = employee.EmployeeID });
    }

    return View(viewModel); // validation error, so redisplay same view
}

계속 실패하고 있어요ModelState.IsValid계속 거짓을 반환하고 보기를 다시 표시합니다.하지만 저는 무슨 오류인지 전혀 모르겠습니다.

오류를 확인하고 사용자에게 다시 표시할 수 있는 방법이 있습니까?

사용해 보세요.

if (ModelState.IsValid)
{
    //go on as normal
}
else
{
    var errors = ModelState.Select(x => x.Value.Errors)
                           .Where(y=>y.Count>0)
                           .ToList();
}

오류는 모든 오류의 목록이 됩니다.

사용자에게 오류를 표시하려면 모델을 보기로 되돌리고 레이저를 제거하지 않은 경우에만 해당 모델을 보기로 되돌립니다.@Html.ValidationFor()표현식이 표시됩니다.

if (ModelState.IsValid)
{
    //go on as normal
}
else
{
    return View(model);
}

보기에는 각 필드 옆 및/또는 유효성 검사 요약(있는 경우)에 유효성 검사 오류가 표시됩니다.

다음을 포함하는 단일 오류 메시지 문자열을 생성하려는 경우ModelState오류 메시지를 사용하여 오류를 단일 목록으로 평탄화할 수 있습니다.

if (!ModelState.IsValid)
{
    var message = string.Join(" | ", ModelState.Values
        .SelectMany(v => v.Errors)
        .Select(e => e.ErrorMessage));
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest, message);
}

HTML을 사용하여 작업에서 특별한 작업을 수행하지 않고 보기에서 이 작업을 수행할 수 있습니다.모든 오류 메시지 또는 Html을 표시하는 ValidationSummary()입니다.ValidationMessageFor() - 모델의 특정 속성에 대한 메시지를 표시합니다.

작업 또는 컨트롤러 내에서 오류를 확인해야 하는 경우 모델 상태를 참조하십시오.오류 속성

Modal State(모달 상태)가 Valid(유효하지 않음)이고 컨트롤이 축소되어 화면에서 오류를 볼 수 없는 경우 HttpStatusCode(HttpStatusCode)를 반환하여 F12를 실행할 경우 실제 오류 메시지가 표시되도록 할 수 있습니다.또한 이 오류를 ELMAH 오류 로그에 기록할 수 있습니다.아래는 코드입니다.

if (!ModelState.IsValid)
{
              var message = string.Join(" | ", ModelState.Values
                                            .SelectMany(v => v.Errors)
                                            .Select(e => e.ErrorMessage));

                //Log This exception to ELMAH:
                Exception exception = new Exception(message.ToString());
                Elmah.ErrorSignal.FromCurrentContext().Raise(exception);

                //Return Status Code:
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest, message);
}

그러나 이 코드는 모든 유효성 검사 오류를 기록합니다.따라서 화면에서 오류를 볼 수 없는 상황이 발생할 때만 사용해야 합니다.

WebApi(MVC가 아닌)를 위해 여기에 있는 사람이 있으면 그냥 반환합니다.ModelState객체:

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);

ModelState.Values.SelectMany(v => v.Errors).ToList().ForEach(x => _logger.Error($"{x.ErrorMessage}\n"));

다음은 OnPost에 복사/붙여 넣을 수 있는 유용한 정보입니다.실패한 유효성 검사 항목을 신속하게 식별하는 Sync() 핸들러:

public async Task<IActionResult> OnPostAsync(string editButton)
    {
        if (!ModelState.IsValid)
        {
            var errors = 
                from value in ModelState.Values
                where value.ValidationState == ModelValidationState.Invalid
                select value;  
            return Page();  // <-- I set a breakpoint here, and examine "errors"
        }
        ...

위의 다른 솔루션과 달리 두 가지 솔루션을 모두 확인할 수 있습니다.

  1. 오류 메시지 텍스트(ErrorMessage)...그리고...
  2. 오류를 발생시킨 특정 필드

확인 확인 및 보기에 추가:

  1. 코드의 ModelState 행에서 중단점을 수행
  2. 모델 상태를 워치에 추가합니다.
  3. 모델 상태 "값" 확장
  4. 값 "결과 보기" 확장

이제 모든 SubKey 목록과 유효성 검사 상태가 값의 끝에 있는 것을 볼 수 있습니다.

Invalid 값을 검색합니다.

샘플 확장입니다.

public class GetModelErrors
{
    //Usage return Json to View :
    //return Json(new { state = false, message = new GetModelErrors(ModelState).MessagesWithKeys() });
    public class KeyMessages
    {
        public string Key { get; set; }
        public string Message { get; set; }
    }
    private readonly ModelStateDictionary _entry;
    public GetModelErrors(ModelStateDictionary entry)
    {
        _entry = entry;
    }

    public int Count()
    {
        return _entry.ErrorCount;
    }
    public string Exceptions(string sp = "\n")
    {
        return string.Join(sp, _entry.Values
            .SelectMany(v => v.Errors)
            .Select(e => e.Exception));
    }
    public string Messages(string sp = "\n")
    {
        string msg = string.Empty;
        foreach (var item in _entry)
        {
            if (item.Value.ValidationState == ModelValidationState.Invalid)
            {
                msg += string.Join(sp, string.Join(",", item.Value.Errors.Select(i => i.ErrorMessage)));
            }
        }
        return msg;
    }

    public List<KeyMessages> MessagesWithKeys(string sp = "<p> ● ")
    {
        List<KeyMessages> list = new List<KeyMessages>();
        foreach (var item in _entry)
        {
            if (item.Value.ValidationState == ModelValidationState.Invalid)
            {
                list.Add(new KeyMessages
                {
                    Key = item.Key,
                    Message = string.Join(null, item.Value.Errors.Select(i => sp + i.ErrorMessage))
                });
            }
        }
        return list;
    }
}

나는 이 방법을 오류를 얻는 일반적인 방법으로 사용합니다.

 public static List<string> GetModelErrros(ModelStateDictionary modelState)
        {
            var errors = modelState.Values.Where(E => E.Errors.Count > 0)
                         .SelectMany(E => E.Errors)
                         .Select(E => E.ErrorMessage)
                         .ToList();

            return errors;
        }

그리고 당신은 그것을 사용할 수 있습니다.

logger.LogInformation("ID {0} input Error  ", string.Join(",", SiteUtils.GetModelErrros(ModelState)));
publicIHttpActionResultPost(Productproduct) {  
    if (ModelState.IsValid) {  
        //Dosomethingwiththeproduct(notshown).  
        returnOk();  
    } else {  
        returnBadRequest();  
    }  
}

OR

public HttpResponseMessage Post(Product product)
        {
            if (ModelState.IsValid)
            {
                // Do something with the product (not shown).

                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            else
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }
        }

ModelState 확장 메서드를 만드는 것을 좋아합니다.

public static class ModelStateExtensions
{

    public static BadRequestObjectResult As<BadRequestObjectResult>(this ModelStateDictionary modelState) 
    {
        var message = string.Join("\r\n", modelState.Values
                                           .SelectMany(v => v.Errors)
                                           .Select(e => e.ErrorMessage));
        return (BadRequestObjectResult)Activator.CreateInstance(typeof(BadRequestObjectResult), message)!;
    }
}

그러면 이렇게 사용합니다.

        if (!ModelState.IsValid)
        {
            return ModelState.As<BadRequestObjectResult>();
        }

사용자의 문제인지는 알 수 없지만, 사용자를 추가한 후 응용프로그램 이름을 변경하면 해당 사용자는 데이터베이스에 남아 있지만 올바른 동작이 아닙니다.그러나 이러한 유형의 오류는 추가되지 않습니다.오류 목록이 비어 있지만 ModelState입니다.IsValid는 로그인에 대해 false를 반환합니다.

해라

ModelState.Values.First().Errors[0].ErrorMessage

언급URL : https://stackoverflow.com/questions/5212248/get-error-message-if-modelstate-isvalid-fails

반응형