Domanda

Sto cercando di utilizzare DataAnnotations per aggiungere la convalida ai miei modelli in asp.NET MVC 2 RC2, utilizzando TryUpdateModel

        var user = UserManager.Find(id);

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

Questa aggiorna il modello, ma la validazione non viene mai chiamato. Ho provato ad utilizzare TryUpdateModel così (che è il tipo diretto di utenti), non utilizzando il provider valore di modulo, utilizzando ProvisioningObject direttamente (che ha i metadati di validazione), senza alcun risultato.

Googling per gli esempi mi dà solo il modo di utilizzare DataAnnotations legandosi attraverso un parametro

public ActionResult Update(User user)

Il che non mi piace per gli scenari di aggiornamento.

Tutte le punte e / o soluzioni?

Modifica I miei oggetti sono oggetti generati automaticamente da un servizio WCF.

ho fatto parziali per essere in grado di aggiungere DataAnnotations. Chiamo TryUpdateModel tre volte perché a quanto pare non supporta l'ereditarietà, che credo sia anche il mio problema con DataAnnotations. Ho specificare gli attributi di convalida per ProvisioningObject, e il legame non cerca cose ereditate del genere.

[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, funziona come previsto, ma che sembra molto ridondante per niente. E vorrebbe dire Vorrei anche essere necessario copiare / incollare tutte le mie interfacce ereditate in modo TryUpdateModel si comporta in modo appropriato.

Credo di essere alla ricerca di un modo che non mi richiede di copiare e incollare il mio convalida attribuisce alle classi ereditate.

È stato utile?

Soluzione

Risposta:

"I miei oggetti sono oggetti generati automaticamente da un servizio WCF."

oggetti generati automaticamente non avranno attributi su di loro. Stai definendo gli oggetti ei loro attributi sul lato server o sul lato client?

Old Risposta: Se i metadati non è su IProvisioningObject allora alcuna convalida sarà chiamato. Il MVC2 legante modello predefinito solo sa come trovare [MetadataType (buddyClass)] informazioni "extra" di convalida.

Per gli scenari di aggiornamento legare contro DTOs e poi mappare il DTOs, se IsValid () per i principali classi del modello.

Altri suggerimenti

Implementare l'interfaccia IDataErrorInfo nella tua classe parziale Si dovrà scrivere convalida personalizzato per ogni campo (dove è possibile utilizzare i dati di classe annotazioni per convalidare ogni proprietà richiesto)

Se avete bisogno di esempio di codice poi fammi sapere. La scriverò per te!

fonte: http: // www.asp.net/(S(pdfrohu0ajmwt445fanvj2r3))/learn/mvc/tutorial-37-cs.aspx

Come fai a sapere che la convalida non viene chiamato? Stai controllando ModelState.IsValid nel controller di aggiornamento e di trovare che è erroneamente tornando vero?

Un tipico modello aggiornamento:

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

Se vi aspettate un po ' "IsValid" sul modello da automaticamente chiamato, che non accadrà. Le annotazioni di dati lavorano dietro le quinte con il dizionario ModelState sulla classe di base Controller.

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