0

Я просто создаю webapi, используя .Net. У меня есть модель автомобиля в методе post, и одно из полей имеет обязательное свойство и тип сообщения об ошибке. Проблема в том, что когда я ничего не вхожу в это заданное поле, мое сообщение не отображается, я получил только сообщение вроде пустой строки (""). Кроме того, если у меня есть поле типа int и я ничего не вводил в этом поле, состояние модели недопустимо. Как я могу пропустить ошибки преобразования и как я могу получить правильное сообщение об ошибке, если я не введу ничего в обязательные поля? Заранее спасибо.ModelState Validation

Это мой код:

My Model:

public class Car 
{ 
    public Guid Id { get; set; } 

    public bool IsActive { get; set; } 

    [Required(ErrorMessageResourceName = "RequiredName", ErrorMessageResourceType = typeof(Car_Resources))] 
    public string Name { get; set; } 

    [Required(ErrorMessageResourceName = "RequiredNumber", ErrorMessageResourceType = typeof(Car_Resources))] 
     public string Number { get; set; } 
} 

Контроллер:

[ValidateModelAttribute] 
public IHttpActionResult Post([FromBody]Car car) 
{ 
} 

ValidateModelAttribute метод:

public override void OnActionExecuting(HttpActionContext actionContext) 
{ 
    if (!actionContext.ModelState.IsValid) 
    { 
     var errors = new List<string>(); 
     foreach (var state in actionContext.ModelState) 
     { 
      foreach (var error in state.Value.Errors) 
      { 
       errors.Add(error.ErrorMessage); 
      } 
     } 

     actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, errors); 
    } 
} 
+0

Когда вы говорите, что у вас есть только сообщение, такое как пустая строка - что произойдет, если вы используете 'ErrorMessage' вместо' ErrorMessageResourceName' - мне интересно, работает ли он, но это просто не поднимает ваше сообщение из ресурсов (Resx)? – Alex

+0

Нет, это не работает. Я думаю, что это потому, что я не устанавливаю значение Number, например. Кроме того, ModelState пытается преобразовать поле в значение по умолчанию. Например, Id является Guid, но я получаю строку как идентификатор, а затем ModelState больше не будет действительным из-за преобразования. – CalinCosmin

ответ

1

Я нашел ответ. Это не самый лучший, но если вы используете [Required] атрибут свойства, то вы можете использовать это:

public override void OnActionExecuting(HttpActionContext actionContext) 
{ 
    if (!actionContext.ModelState.IsValid) 
    { 
     var errors = new List<string>(); 
     foreach (var state in actionContext.ModelState) 
     { 
      foreach (var error in state.Value.Errors) 
      { 
       if (error.Exception == null) 
       { 
        errors.Add(error.ErrorMessage); 
       } 
      } 
     } 

     if (errors.Count > 0) 
     { 
      actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, errors); 
     } 
    } 
} 

свойства, которые необходимы не будут бросать никаких исключений, будет иметь только сообщение об ошибке, так что вы можете отфильтровать исключения.