Convalida personalizzata con annotazioni dei dati

asp.net-mvc data-annotations entity-framework

Domanda

Sto usando le annotazioni dei dati per controllare i dati che vengono inseriti, ma sono bloccato quando si tratta di un modo più personalizzato di convalidare i dati.

Ho bisogno di eseguire query sul database per vedere se ci sono cose lì o no, e poi riportare all'utente se compare un "errore di db-check personalizzato", come "Il nome della società esiste già"

Come posso implementare una cosa del genere insieme con le annotazioni dei dati?

Ho tutte le query fatte ecc. Usando linq e framework di entità che viene fornito con 3.5sp1

/ M

Risposta accettata

Attributi personalizzati che estendono annotazioni di dati

Dovrai scrivere i tuoi attributi che faranno la convalida della tua istanza di oggetto contro l'archivio dati.

Assicurati che le tue classi ereditino la classe System.ComponentModel.DataAnnotations.ValidationAttribute :

public class MustNotExist: ValidationAttribute
{
    ...
}

Attenzione

Mi sono imbattuto in una situazione simile quando avevo bisogno di convalidare che l'oggetto è unico all'interno dell'archivio dati. Ma questo tipo di convalida non era possibile sulla classe di entità stessa, poiché dovrebbe funzionare solo per quelle entità che vengono create ma non quando si restituisce già l'entità dall'archivio dati.

La mia soluzione era avere un'interfaccia, una classe e un attributo separati.

public interface IExternalValidator ...

class DBUniqueValidator: IExternalValidator ...

class ValidateExternallyAttribute: FilterAttribute, IActionFilter
{
    ...
    public ValidateExternallyAttribute(Type validatorType, Type entityType) ...
    ...
}

Sono stato in grado di posizionare il mio attributo sulle azioni del controllore che ottengono i parametri dell'entità. L'attributo action filtro controlla quindi i parametri di azione del controller (può accedere facilmente ai tipi e ai valori) ed esegue il validatore esterno rispetto ai parametri corretti (tipi forniti nella definizione dell'attributo) e popola gli errori ModelState quando la convalida fallisce.

[ValidateExternally(typeof(DBUniqueValidator), typeof(User))]
public ActionResult RegisterUser(User newUser)
{
    if (!this.ModelState.IsValid)
    {
        // act accordingly - probably return some error depending on model state errors
    }
    // register new user in data store
}

In questo modo sono stato in grado di eseguire la convalida esterna solo su quelle azioni che effettivamente lo richiedevano, e questa tecnica ha anche aiutato il mio codice di azioni del controller a rimanere pulito e breve. Tutto quello che dovevo fare è controllare se ci sono errori di stato del modello.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché