2010-02-08 4 views
5

Ich versuche DataAnnotations zu verwenden Validierung meiner Modelle in asp.NET MVC 2 RC2, TryUpdateModelasp.NET MVC 2 DataAnnotations Update <T> Validierung

mit
 var user = UserManager.Find(id); 

     this.TryUpdateModel<IProvisioningObject>(user, form.ToValueProvider()); 

das Modell Dies aktualisiert hinzuzufügen, aber die Validierung wird nie genannt. Ich versuchte auch, TryUpdateModel (das ist der direkte Typ des Benutzers) zu verwenden, den Formularwertanbieter nicht verwendend, ProvisioningObject direkt verwendend (das die Überprüfungsmetadaten hat), vergeblich.

für Beispiele googeln gibt mir nur Wege DataAnnotations zu verwenden, indem

public ActionResult Update(User user) 

Was ich für Update-Szenarien nicht mögen durch eine Parameterbindung.

Irgendwelche Tipps und/oder Lösungen?

BEARBEITEN Meine Objekte sind automatisch generierte Objekte aus einem WCF-Dienst.

Ich habe Teilbilder gemacht, um DataAnnotations hinzufügen zu können. Ich rufe TryUpdateModel dreimal auf, weil es anscheinend keine Vererbung unterstützt, was meiner Meinung nach auch mein Problem mit DataAnnotations ist. Ich gebe die Validierungsattribute für ProvisioningObject an, und die Bindung sucht nicht nach geerbten Dingen wie dieser.

[MetadataType(typeof(ProvisioningObjectMetadata))] 
public partial class ProvisioningObject : IProvisioningObject 
{ 
    public string DisplayNameInvariant { get { return string.IsNullOrEmpty(this.DisplayName) ? this.Name : this.DisplayName; } } 
} 


[MetadataType(typeof(UserMetadata))] 
public partial class User : IUser 
{ 
} 


public class ProvisioningObjectMetadata 
{ 
    [DisplayName("Country")] 
    public string CountryIsoCode { get; set; } 

    [Required(ErrorMessageResourceType = typeof(Properties.Validation), ErrorMessageResourceName = "DisplayNameIsRequired")] 
    [TempValidator] 
    public string DisplayName { get; set; } 
} 


public class UserMetadata 
{ 
    [DisplayName("Username")] 
    public string Name { get; set; } 
} 


// Controller action 
    public ActionResult Update(string id, FormCollection form) 
    { 
     var user = UserManager.Find(id); 

     this.TryUpdateModel<IUser>(user.User, form.ToValueProvider()); 
     this.TryUpdateModel<IPerson>(user.User, form.ToValueProvider()); 
     this.TryUpdateModel<IProvisioningObject>(user.User, form.ToValueProvider()); 

     if (ModelState.IsValid) // always true 
     { 
      return Redirect; 
     } 
     else 
     { 
      return View(); 
     } 
    } 

Wenn ich die Metadaten für Display in UserMetadata hinzufügen, es funktioniert wie erwartet, aber das scheint für nichts sehr überflüssig. Und es würde bedeuten, dass ich auch alle meine geerbten Schnittstellen kopieren/einfügen müsste, damit sich TryUpdateModel entsprechend verhält.

Ich denke, ich suche nach einer Möglichkeit, die nicht erfordert, dass ich meine Validierungsattribute kopieren und in geerbte Klassen einfügen.

Antwort

1

Neue Antwort:

"Meine Objekte sind automatisch generierten Objekte aus einem WCF-Dienst."

Automatisch generierte Objekte haben keine Attribute auf ihnen. Definieren Sie Ihre Objekte und ihre Attribute serverseitig oder clientseitig?

Alte Antwort: Wenn Ihre Metadaten nicht auf IProvisioningObject sind, wird keine Validierung aufgerufen. Der MVC2-Standardmodellbinder weiß nur, wie er "zusätzliche" [MetadataType (BuddyClass)] Validierungsinformationen findet.

Für Updateszenarien binden Sie an DTOs und ordnen Sie dann die DTOs zu, wenn IsValid() an Ihre Hauptmodellklassen gebunden ist.

+0

Ich habe gerade versucht Update zu tun (da ich nicht MetadataType auf einer Schnittstelle setzen kann) und es ändert nichts. Ich habe einen temporären Validator erstellt und scheint die IsValid-Methode nie zu treffen. Für das Update-Szenario bin ich nicht sicher, ob ich dir folge. Wenn Sie gute Links zu Blogs oder Beispielen haben, würde das ausreichen, um mich zu starten. Danke für deine Eingabe! –

+0

Können Sie bitte mehr Code posten? Ich bin mir nicht sicher, was du zu tun versuchst. – jfar

+0

Neu Antwort Kommentar: Die Attribute sind clientseitig. Ich verwende partielle Klassen, um den automatisch generierten Objekten die richtigen Attribute hinzuzufügen. –

0

Woher wissen Sie, dass die Validierung nicht aufgerufen wird? Überprüfen Sie ModelState.IsValid in Ihrem Update-Controller und feststellen, dass es fälschlicherweise wieder wahr ist?

Ein typisches Update Muster:

UpdateModel(model); 
if(!ModelState.IsValid) return View(model); 
return RedirectToAction("Index"); 

Wenn Sie etwas „IsValid“ auf Ihrem Modell erwarten automatisch aufgerufen werden, das wird nicht passieren. Die Datenanmerkungen funktionieren hinter den Kulissen mit dem ModelState-Wörterbuch in der Controller-Basisklasse.

+0

ModelState.IsValid ist immer wahr, auch wenn ich ein benutzerdefiniertes Validierungsattribut eingabe, das immer false zurückgibt. Ein Haltepunkt in diesem Validierungsattribut wird auch nie getroffen. Es funktioniert, wenn ich die Validierung direkt auf den Typ und nicht die Schnittstelle setzen. Ich werde in einer Sekunde mehr Code einfügen. –

+0

Haben Sie versucht, Ihr Metadatentyp-Attribut in Ihrer Klassendeklaration zu platzieren? Beispiel: Schnittstelle IDataObject {... enthält DataAnnotations ...} [MetadataType (typeof (IDataObject))] Klasse Dataobject {....} – kmehta

+0

Mehta gleiche Problem. Es funktioniert, wenn ich die DataAnnotations direkt in die Schnittstelle einfüge, aber ich möchte die Validierung nicht von der Elternklasse/Schnittstelle duplizieren. –

Verwandte Themen