2010-03-15 13 views
6

sto appena iniziato con ASP.NET MVC 2, e giocare con convalida.Come convalidare due proprietà con ASP.NET MVC 2

Diciamo che disponiamo di 2 immobili:

  • password1
  • Password2

e voglio richiedere che entrambi sono riempiti, e richiedono che entrambi sono gli stessi prima che il modello è valido.

Ho una semplice classe denominata "NewUser".

Come faccio a implementare questo? Ho letto su ValidationAttribute e lo capisco. Ma io non vedo come avrei usato che per implementare una convalida che mette a confronto due o più proprietà contro eathother.

Grazie in anticipo!

problema con sottostante soluzione:

Quando questo viene applicato a un'applicazione e l'ModelBinder gestisce la validazione del modello, poi c'è è un problema:

Se un ValidationAttribute a livello di proprietà contiene un errore, quindi i valori di Classe di attribuzione sono NON convalidato. Non ho ancora trovato una soluzione a questo problema.

Se si dispone di una soluzione a questo problema si prega di condividere la vostra esperienza. Molte grazie!

risposta

7

Il valore di default ASP.NET MVC 2 template di Visual Studio include l'attributo di convalida esatto avete bisogno. Incollato da AccountModels.cs di file:

[AttributeUsage(AttributeTargets.Class, 
    AllowMultiple = true, Inherited = true)] 
public sealed class PropertiesMustMatchAttribute : ValidationAttribute { 
    private const string _defaultErrorMessage = 
     "'{0}' and '{1}' do not match."; 
    private readonly object _typeId = new object(); 

    public PropertiesMustMatchAttribute(string originalProperty, 
     string confirmProperty) 
     : base(_defaultErrorMessage) { 
     OriginalProperty = originalProperty; 
     ConfirmProperty = confirmProperty; 
    } 

    public string ConfirmProperty { get; private set; } 
    public string OriginalProperty { get; private set; } 

    public override object TypeId { 
     get { 
      return _typeId; 
     } 
    } 

    public override string FormatErrorMessage(string name) { 
     return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString, 
      OriginalProperty, ConfirmProperty); 
    } 

    public override bool IsValid(object value) { 
     PropertyDescriptorCollection properties = 
      TypeDescriptor.GetProperties(value); 
     object originalValue = properties.Find(OriginalProperty, 
      true /* ignoreCase */).GetValue(value); 
     object confirmValue = properties.Find(ConfirmProperty, 
      true /* ignoreCase */).GetValue(value); 
     return Object.Equals(originalValue, confirmValue); 
    } 
} 

Come usare:

[PropertiesMustMatch("Password", "ConfirmPassword", 
    ErrorMessage = "The password and confirmation password do not match.")] 
class NewUser { 
    [Required] 
    [DataType(DataType.Password)] 
    [DisplayName("Password")] 
    public string Password { get; set; } 
    [Required] 
    [DataType(DataType.Password)] 
    [DisplayName("Confirm password")] 
    public string ConfirmPassword { get; set; } 
} 
+1

L'unico problema che vedo con questo è, quando due proprietà del modello (classe in questo caso), non sono uguali, non indica le proprietà specifiche come contenenti errori, come per [Required] e <% = Html.ValidationMessageFor (m => m.Password1)%> – CodeMonkey

+0

@CodeMonkey, vedo. Anche se non sono sicuro che esista una soluzione elegante per farlo funzionare in un altro modo, utilizzando l'associazione dei modelli. Dopotutto, questa è tecnicamente una convalida a livello di classe. Se ** devi ** aggiungere gli errori alle proprietà, allora forse controllare i due valori nel controller dopo che l'associazione sarebbe la soluzione più veloce (sebbene non la più elegante). –

+0

Nella versione MVC 2 il metodo helper Html.ValidationSummary ora può visualizzare solo errori a livello di modello – murki

Problemi correlati