2016-04-30 1 views
2

У меня есть эта модельMVC ModelState.IsValid = истина с нулевым требуемым свойством

public class ModelVM 
{ 
    private string _rD; 
    [Required] 
    public string RD 
    { 
     get 
     { 
      return _rD; 
     } 
     set 
     { 
      _rD = RCodes.Contains(value)? value : null; 
     } 
    } 

    private static List<string> RCodes = new List<string> 
    { 
     "OK", 
     "OTHER", 
     "ANOTHER" 
    }; 
} 

В моей MVC контроллер

public class MyController : Controller 
{ 
    public ActionResult Index(ModelVM modelVM, FormCollection collection) 
    { 

     if (!ModelState.IsValid) 
      return Json(new 
      { 
       Result = "ERROR", 
       Message = "Missing fields." 
      }); 

     return Json("OK"); 
    } 
} 

Я посылаю: { RD: "Whatever" }

И при отладке ModelState.IsValid=true. У меня есть аналогичный код на контроллере WebApi и работает, как я ожидаю (modelstate.valid=false)

У вас есть идеи, почему MVC это делает? или что не так с моим кодом?

+0

Во время отладки, какое значение хранится в 'modelVM.RD' если поставить точку останова на если заявление. – Nkosi

+1

'ModelState.IsValid' сообщает вам, были ли какие-либо ошибки модели добавлены в' ModelState'. В этом случае это верно, потому что в ModelState нет ошибок. Вы сказали, что отправили '{RD:« Что бы ни было »}'. связующее устройство по умолчанию будет смотреть на отправленные данные и сопоставлять свойства с предполагаемым типом. С точки зрения привязки проверка '[Обязательная]' была выполнена, потому что когда связующее просматривало словарь, в входящие данные было предоставлено требуемое свойство «RD». – Nkosi

ответ

2

ModelState.IsValid Сообщает вам, были ли какие-либо ошибки модели добавлены в ModelState.

В этом случае он действителен, поскольку в предоставленных данных нет ошибок на стороне клиента, которые повлияли бы на ModelState.

Вы сказали ...

Я послал {RD: «все»}

... а это означает, что модель связующий будет смотреть на данные, отправляемые и соответствуют свойствам с предполагаемым типом. С точки зрения привязки модели проверка соответствия [Required] была выполнена потому, что, когда связующее просматривало словарь значений маршрута для требуемого свойства RD, он был предоставлен клиентом во входящих данных.

Если вы хотите вручную аннулирует состояние вы можете ...

public ActionResult Index(ModelVM modelVM, FormCollection collection) 
{ 
    if(ModelState.IsValid) { 
     if(modelVM.RD == null) { 
      ModelState.AddModelError("RD", "RD is invalid."); 
     } 
    } 

    if (!ModelState.IsValid) 
     return Json(new 
     { 
      Result = "ERROR", 
      Message = "Missing fields." 
     }); 

    return Json("OK"); 
} 
+0

Хммм, я не хотел этого делать, но, полагаю, должен. Вы знаете, почему с помощью контроллера WebApi та же логика ([требуется], _rD = RDCodes.ValidMethod ...) делает ModelState.IsValid = false? – user3131922

+1

Код может выглядеть одинаково и использоваться одинаково, но логика, используемая в web api, не такая же, как в MVC. Вот почему в версии vNext они объединяют базу кода обратно в одну. – Nkosi

Смежные вопросы