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"
}
...
위의 다른 솔루션과 달리 두 가지 솔루션을 모두 확인할 수 있습니다.
- 오류 메시지 텍스트(ErrorMessage)...그리고...
- 오류를 발생시킨 특정 필드
확인 확인 및 보기에 추가:
- 코드의 ModelState 행에서 중단점을 수행
- 모델 상태를 워치에 추가합니다.
- 모델 상태 "값" 확장
- 값 "결과 보기" 확장
이제 모든 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
'programing' 카테고리의 다른 글
Swift에서 기본 탐색 모음 공간을 제거하는 방법UI 탐색 보기 (0) | 2023.04.26 |
---|---|
시트를 복사하고 결과 시트 개체를 가져오시겠습니까? (0) | 2023.04.26 |
Wpf 애니메이션 배경색 (0) | 2023.04.26 |
이클립스에서 프로젝트 탐색기 창을 표시하는 방법은 무엇입니까? (0) | 2023.04.26 |
GitHub 리포지토리에서 변경한 내용으로 로컬 리포지토리 업데이트 (0) | 2023.04.26 |