Почему мой инт?значение проверяется так, как если бы это было необходимо? - PullRequest
6 голосов
/ 31 января 2012

У меня есть int? просмотреть свойство модели, которое проверяется на стороне клиента, как если бы это было необходимо. То есть, если я оставлю поле пустым, оно не будет отправлено. То же самое не происходит для строковых свойств.

HTML-код для моего редактора:

<input type="text" value="" name="StatusIdSearch" id="StatusIdSearch" data-val-number="The field Status must be a number." data-val="true" class="text-box single-line">

Я считаю, что data-val-number вызывает ошибку, потому что ничто не является числом, но я не могу определить, почему.

Есть идеи?

Редактировать

Модель просмотра:

public class CompromissoSearchModel
{
        // other properties removed for the sake of clarity

        [Display(Name = "Status")]
        [EnumDataType(typeof(StatusCompromisso))]
        public int? StatusIdSearch { get; set; }

       // other properties removed for the sake of clarity
}

Ответы [ 3 ]

3 голосов
/ 31 января 2012

Сообщение, которое вы видите, не связано с обязательной проверкой поля.Вы получаете это, потому что ClientDataTypeModelValidatorProvider добавляет числовую проверку клиента и игнорирует, может ли тип иметь значение NULL или нет.Вы можете проверить код самостоятельно :

private static IEnumerable<ModelValidator> GetValidatorsImpl(
    ModelMetadata metadata, 
    ControllerContext context) 
{
    Type type = metadata.RealModelType;
    if (IsNumericType(type)) {
        yield return new NumericModelValidator(metadata, context);
    }
}

И реализацию IsNumericType:

private static bool IsNumericType(Type type) 
{
    // strip off the Nullable<>
    Type underlyingType = Nullable.GetUnderlyingType(type); 
    return _numericTypes.Contains(underlyingType ?? type);
}

Поскольку значение nullable не учитывается, вы всегда получаете эту проверку.С точки зрения решения, вам нужно удалить ClientDataTypeModelValidatorProvider из используемых провайдеров или, возможно, заменить его на пользовательский, который не игнорирует nullable.

1 голос
/ 31 января 2012

У вас должна быть возможность добавить следующий код к вашему Application_Start методу в файле Global.asax для решения этой проблемы:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

0 голосов
/ 26 ноября 2013

У меня была точно такая же проблема, и мне удалось найти решение. Ни одно из этих решений не помогло мне, поэтому я решил опубликовать свое решение для всех, у кого есть эта проблема.

Проблема заключалась не в том, что механизм связывания модели проверял поле как недопустимое, а в том, что при использовании TryUpdateModel свойство nullable viewmodel не могло быть пустым в объекте базы данных.

Более четкое объяснение:

TryUpdateModel(dbUser, "", new[]{
    "DecimalProperty"
}));

"DecimalProperty" в модели представления может быть обнуляемым, но в dbUser не обнуляемым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...