Come posso utilizzare un ValidationAttribute personalizzato per garantire che due proprietà corrispondano?

StackOverflow https://stackoverflow.com/questions/2595715

Domanda

Stiamo utilizzando xVal e lo standard DataAnnotationsValidationRunner descritto Qui per raccogliere errori di convalida dai nostri oggetti di dominio e visualizzare modelli in ASP.NET MVC.Mi piacerebbe avere un modo per far sì che il corridore di convalida identifichi quando due proprietà non corrispondono attraverso l'uso di DataAnnotations personalizzate.

In questo momento sono costretto a farlo al di fuori del corridore, in questo modo:

if (!(model.FieldOne == model.FieldTwo))
    errors.Add(new ErrorInfo("FieldTwo", "FieldOne must match FieldTwo", model.FieldTwo));

La mia domanda è:questo può essere fatto utilizzando gli attributi di convalida a livello di proprietà o sono costretto a utilizzare attributi a livello di classe (nel qual caso, dovrei modificare il corridore... e la mia domanda successiva sarebbe come recuperarli al meglio in questo caso).

Grazie!

AGGIORNAMENTO: Finalmente ho capito come scrivere la query dell'oggetto per implementare il suggerimento nella risposta selezionata;Concateno i risultati di questa query con i risultati del corridore di convalida standard, se qualcuno fosse curioso.Tieni presente che ho modificato TypeId in modo che sia la proprietà del campo di conferma.

var classErrorQuery =
      from attribute in
          instance.GetType().GetCustomAttributes(typeof (ValidationAttribute), false).Cast
          <ValidationAttribute>()
      where !attribute.IsValid(instance)
      select new ErrorInfo(attribute.TypeId.ToString(), attribute.FormatErrorMessage(string.Empty), instance);
È stato utile?

Soluzione

Vedere Scrittura di un attributo CompareTo DataAnnotation

e puoi anche controllare AccountMOdel nel progetto predefinito di MVC2, c'è un attributo PropertiesMustMatchAttribute applicato a ChangePasswordModel per verificare che NewPassword e confirmPassword corrispondano

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top