Domanda

Sono utilizzando le annotazioni di dati per controllare i dati che l'essere entrati, ma mi sono bloccato quando si tratta di modo più personalizzato per convalidare i dati.

Ho bisogno di eseguire query su database per vedere se esiste roba lì o no, e poi riferire all'utente se viene visualizzato un "errore di db-controllo su ordinazione", come ad esempio "Il companyname esiste già"

Come posso implementare una cosa del genere con dataannotations?

Ho tutte le query fatto ecc utilizzando LINQ e Entity Framework che viene fornito con 3.5SP1

/ M

È stato utile?

Soluzione

attributi

personalizzati che estendono le annotazioni di dati

Si dovrà scrivere i propri attributi che faranno la convalida della vostra istanza di un oggetto contro archivio dati.

Assicurati che il tuo classi ereditano classe System.ComponentModel.DataAnnotations.ValidationAttribute:

public class MustNotExist: ValidationAttribute
{
    ...
}

Attenzione

ho incontrato una situazione simile quando avevo bisogno di verificare che l'oggetto è unico all'interno di archivio dati. Ma questo tipo di convalida non è stato possibile sulla classe entità stessa, dal momento che dovrebbe funzionare solo per quei soggetti che si stanno creando, ma non quando si torna vostra entità dall'archivio dati già.

La mia soluzione era quella di avere un'interfaccia separata, di classe e attributi.

public interface IExternalValidator ...

class DBUniqueValidator: IExternalValidator ...

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

Sono stato in grado di mettere la mia attributo azioni di controllo che ottengono parametri di entità. attributo action filtro controlla quindi parametri di azione regolatore (si può facilmente accedere ai loro tipi e valori) e gira validatore esterna contro corretti parametri (tipi fornite negli definizione di attributo) e popola ModelState errori quando la validazione 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 in realtà ne avevano bisogno, e questa tecnica anche aiutato il mio controller codice azioni di rimanere pulito e breve. Tutto quello che dovevo fare è quello di verificare se ci sono errori di modello di stato.

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