2015-03-19 2 views
0

Используя MVC5, у меня есть модель с значением int, которая не может быть равна NULL и не должна иметь значение NULL, однако я не хочу, чтобы связующее устройство автоматически потребовало, чтобы это поле (вид привязан к списку <> и любой элемент в списке может быть оставлен пустым, и, следовательно, не сохраняется в БД), поэтому я ставлю следующее Application_Start():AddImplicitRequiredAttributeForValueTypes = false не работает, когда ошибка проверки контроллера возвращает вид

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 

Это прекрасно работает, когда сначала отображается мое представление, но когда пользователь нажимает кнопку «Сохранить», все проверки проходят, тогда действие «Контроллер» выполняет дополнительную проверку перекрестной записи (например, общее количество записей должно равняться 100). Если проверка не пройдена, я затем установить пользовательскую ошибку и вернуть вид:

ModelState.AddModelError("", "Total Allocation must equal 100%."); 
return View("Shipment", shipment); 

После того, что общая сумма корректируется, пользователь снова нажимает Save, и теперь неявная проверка Обязательный начинается происходит на стороне клиента и никогда не отправляет HttpPost обратно в корректуру контроллера : неявная проверка выполняется на стороне сервера, а не на стороне клиента. Это та же неявная проверка, которую я отключил в Application_Start (я проверил в режиме отладки, и это все еще ложно, когда View возвращается с ошибкой).

Это ошибка с AddImplicitRequiredAttributeForValueTypes или я что-то не так?

ТИА -vg

ответ

0

Я нашел работу вокруг, что я не стал бы называть «разрешение», но по крайней мере это обходные в случае, если кто-то считает, что это полезно. Сначала я думал, что неявная проверка выполняется на стороне клиента, но нет, она попадает в контроллер, но ModelState.IsValid теперь является ложным. Это важно, потому что моя работа зависит от управления, отправляемого контроллеру. Вот что я сделал:

//Remove implicit validations 
foreach (KeyValuePair<string,ModelState> stateItem in ModelState) 
{ 
    if (stateItem.Key.Contains("AllocationAmount")) 
    { 
     if (stateItem.Value.Errors.Count > 0 && stateItem.Value.Errors[0].ErrorMessage.Contains("required")) 
     { 
      stateItem.Value.Errors.RemoveAt(0); 
     } 
    } 
} 

//Check Validation 
if (!ModelState.IsValid) 
{ 
    return PartialView("pvShipment", shipment); 
} 

Проверяя для конкретного столбца, имеющего «требуемое» сообщение об ошибке и удаление его перед тем проверки ModelState.IsValid, то IsValid теперь возвращает истину (до тех пор, как никакие другие ошибки существуют, конечно), и он может продолжить логику сохранения. Я надеюсь в этом есть смысл.

-VG