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.
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! –
Können Sie bitte mehr Code posten? Ich bin mir nicht sicher, was du zu tun versuchst. – jfar
Neu Antwort Kommentar: Die Attribute sind clientseitig. Ich verwende partielle Klassen, um den automatisch generierten Objekten die richtigen Attribute hinzuzufügen. –