2012-01-31 17 views
6

Mam int? przeglądaj właściwość modelu, która jest sprawdzana po stronie klienta tak, jakby była wymagana. Oznacza to, że jeśli zostawię to pole puste, nie zostanie ono przesłane. To samo nie dzieje się w przypadku właściwości ciągów.Dlaczego moje int? wartość jest sprawdzana tak, jakby była wymagana?

HTML świadczonych dla mojego edytora jest:

<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"> 

wierzę, że data-val-number powoduje błąd, ponieważ nic nie jest liczbą, ale nie można określić przyczyny.

Wszelkie pomysły?

Edit

Widok-model:

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 
} 
+4

Pokaż nam swój model. –

+0

@SergioTapia: Dziękujemy za obejrzenie. Zaktualizowałem pytanie: –

+1

Czy odpowiedź podana tutaj: http://stackoverflow.com/questions/4700172/unrequired-property-keeps-getting-data-val-required-attribute help? – hvd

Odpowiedz

1

Powinieneś móc dodać następujący kod do metody w pliku Global.asax Application_Start, aby rozwiązać ten problem:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

+0

Dziękuję Scott, ale spowoduje to, że nie wartości typu zerowego akceptować wartości null z klienta –

+0

i znaleźć to zachowanie dla kont typu zerowego wartości intuicyjne. –

3

Wiadomość, którą widzisz nie jest powiązana z wymaganym polem validat jon. Otrzymujesz to, ponieważ ClientDataTypeModelValidatorProvider dodaje numeryczne sprawdzanie poprawności klienta i ignoruje je, jeśli typ jest null lub nie. Można check the code yourself:

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

i wdrożenie IsNumericType:

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

Ponieważ pustych nie jest uważany zawsze masz ten walidacji. Jeśli chodzi o rozwiązanie, musisz usunąć ClientDataTypeModelValidatorProvider z używanych dostawców lub może zastąpić go niestandardowym, który nie ignoruje zerowania.

+0

angelo: Wciąż analizuję twoją odpowiedź. To dziwne, ponieważ właśnie stworzyłem nowy projekt MVC i int? właściwości nie są sprawdzane zgodnie z wymaganiami, a właściwości [Wymagane] to. Jest coś dziwnego w tym konkretnym projekcie, ponieważ wydaje się, że nie jest to oczekiwane zachowanie. –

0

Miałem dokładnie ten sam problem i udało mi się znaleźć rozwiązanie. Żadne z tych rozwiązań nie zadziałało, więc pomyślałem, że opublikuję rozwiązanie dla każdego, kto ma ten problem.

Problem polegał nie na tym, że segregator modelu sprawdzał poprawność pola jako niepoprawny, ale podczas korzystania z TryUpdateModel właściwość zerowalna obiektu viewmodel nie była możliwa do zniesienia w jednostce bazy danych.

Jaśniejsze wyjaśnienie:

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

"DecimalProperty" w viewmodel było pustych, ale nie było pustych w dbuser.

Powiązane problemy