2011-11-23 16 views
20

Mam problem z moją aplikacją ASP.NET MVC 3. Mam 2 właściwości w moim modelu, zgodnie z którymi chcę, aby tylko jeden z nich był wymagany w moim widoku na podstawie tego, który z nich jest pusty. Tak na przykład, jeśli wprowadzić numer telefonu, a następnie e-mail nie jest już wymagane i vice versa, ale jeśli mogę zostawić zarówno puste, wówczas powinny być wymagane 1, poniżej jest mój model:Walidacja modelu/ASP.NET MVC 3 - warunkowy wymagany atrybut

[Display(Name = "Contact Phone Number:")] 
[MaxLength(150)] 
public string ContactPhoneNumber { get; set; } 

[Display(Name = "Contact Email Address:")] 
[MaxLength(100)] 
public string ContactEmailAddress { get; set; } 

musiałbym utworzyć niestandardowy atrybut do sprawdzenia poprawności mojego modelu, a jeśli tak, w jaki sposób mogę to osiągnąć?

Odpowiedz

23

Możesz wdrożyć IValidatableObject na swojej klasie i dostarczyć metodę Validate(), która implementuje niestandardową logikę. Połącz to z niestandardową logiką sprawdzania poprawności na kliencie, jeśli wolisz, aby ta została dostarczona. Jest to łatwiejsze niż implementowanie atrybutu.

public class ContactModel : IValidatableObject 
{ 
    ... 

    public IEnumerable<ValidationResult> Validate(ValidationContext context) 
    { 
     if (string.IsNullOrWhitespace(ContactPhoneNumber) 
      && string.IsNullOrWhitespace(ContactEmailAddress)) 
     { 
      yield return new ValidationResult("Contact Phone Number or Email Address must be supplied.", new [] { "ContactPhoneNumber", "ContactEmailAddress" }); 
     } 
    } 
} 

aby wszystko działa po stronie klienta trzeba dodać następujący skrypt do widzenia:

<script type="text/javascript"> 
$(function() { 
    $('form').validate(); 
    $('form').rules('add', { 
     "ContactPhoneNumber": { 
      depends: function(el) { return !$('#ContactEmailAddress').val(); } 
     } 
    }); 
}); 
</script> 
+0

jak o walidacji po stronie klienta? – jgauffin

+2

Prawdopodobnie podłącz się do wtyczki sprawdzania poprawności jQuery, dodając niestandardową regułę. '$ ('form'). validate(); $ ("formularz"). rules ('add', {"ContactPhoneNumber": {zależy: funkcja (el) {return! $ ('# ContactEmailAddress'). val();}}}); 'lub podobny – tvanfosson

+0

I Trochę pogrzebałem, ale nie znalazłem łatwego sposobu na stworzenie atrybutu, który łączy się z zautomatyzowanym środowiskiem walidacyjnym po stronie klienta. Jeśli jesteś zainteresowany, możesz prześledzić sposób, w jaki jest porównywany atrybut CompareAttribute i zobaczyć, czy możesz rozszerzyć framework o coś podobnego. – tvanfosson

1

I wiem, że masz już rozwiązanie, ale ja miałem podobną sytuację, więc może moje rozwiązanie okaże się pomocne dla kogoś innego. Zaimplementowałem niestandardowy atrybut z walidacją po stronie klienta. Oto mój blogu: Walidacja warunkowa http://hobbscene.com/2011/10/22/conditional-validation/

15

Adnotacja oparte można zdefiniować za pomocą ExpressiveAnnotations:

[RequiredIf("ContactPhoneNumber == null", 
    ErrorMessage = "At least email or phone should be provided.")] 
public string ContactEmailAddress { get; set; } 

[RequiredIf("ContactEmailAddress == null", 
    ErrorMessage = "At least email or phone should be provided.")] 
public string ContactPhoneNumber { get; set; } 
Powiązane problemy