Sto cercando di utilizzare DataAnnotations per aggiungere convalida per i miei modelli in asp.NET MVC 2 RC2, utilizzando TryUpdateModelasp.NET MVC 2 DataAnnotations UpdateModel <T> convalida
var user = UserManager.Find(id);
this.TryUpdateModel<IProvisioningObject>(user, form.ToValueProvider());
Questa aggiorna il modello, ma la convalida non viene mai chiamato. Ho provato a utilizzare TryUpdateModel (che è il tipo diretto dell'utente), non utilizzando il provider del valore del modulo, utilizzando ProvisioningObject direttamente (che ha i metadati di convalida), senza alcun risultato.
Googling per gli esempi mi dà solo il modo di utilizzare DataAnnotations legandosi attraverso un parametro
public ActionResult Update(User user)
che non amo per gli scenari di aggiornamento.
Eventuali suggerimenti e/o soluzioni?
EDIT I miei oggetti sono oggetti generati automaticamente da un servizio WCF.
Ho creato partial per aggiungere DataAnnotations. Io chiamo TryUpdateModel tre volte perché apparentemente non supporta l'ereditarietà, il che credo sia anche il mio problema con DataAnnotations. Specifico gli attributi di convalida per ProvisioningObject e l'associazione non ricerca elementi ereditati come quello.
[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();
}
}
Se posso aggiungere i metadati per DisplayName in UserMetadata, esso funziona come previsto, ma che sembra molto ridondante per niente. E significherebbe che dovrei anche copiare/incollare tutte le mie interfacce ereditate in modo che TryUpdateModel si comporti in modo appropriato.
Suppongo che sto cercando un modo che non mi imponga di copiare e incollare i miei attributi di convalida in classi ereditate.
Ho solo cercato di fare UpdateModel (dato che non posso mettere MetadataType su un'interfaccia) e non cambia nulla. Ho creato un validatore temporaneo e non sembra aver mai colpito il metodo IsValid. Per lo scenario di aggiornamento, non sono sicuro di seguirti. Se hai buoni collegamenti a blog o esempi, sarebbe sufficiente per farmi iniziare. Grazie per l'input! –
Puoi pubblicare più codice per favore? Non sono chiaro su cosa stai cercando di fare più. – jfar
Nuovo commento di risposta: gli attributi sono lato client. Uso le classi parziali per aggiungere gli attributi appropriati agli oggetti generati automaticamente. –