Domanda

Sto utilizzando un livello di servizio con un ModelStateWrapper come mostrato Qui.

Qual è il modo corretto per controllare le chiavi di errore da utilizzare durante la convalida nel livello di servizio in modo che corrispondano ai nomi di input nelle mie visualizzazioni?

per esempio.Ho il seguente ViewModel per un cliente:

public class CustomerViewModel
{
    public string Name { get; set; }
    /*…*/
}

E il seguente ViewModel per la vista di alcuni casi d'uso (l'utente può creare al volo due clienti in questo caso d'uso inserendo i loro nomi):

public class SomeOtherUseCaseViewModel
{
    public CustomerViewModel BuyingCustomer { get; set; }
    public CustomerViewModel SellingCustomer { get; set; }
    /*… */
}

Che utilizzo nella vista in questo modo:

<!-- … -->
<%: Html.EditorFor(model => model.BuyingCustomer.Name) %>
<%: Html.ValidationMessageFor(model => model.BuyingCustomer.Name) %>
<!-- … -->
<%: Html.EditorFor(model => model.SellingCustomer.Name) %>
<%: Html.ValidationMessageFor(model => model.SellingCustomer.Name) %>

Nel mio servizio clienti ho il seguente metodo di convalida che viene chiamato durante la creazione del cliente (nota che questa è una classe Cliente diversa, questa è una classe di dominio):

public bool ValidateCustomer(Customer customer)
{
    /* Check if there is another customer with the same name */
    if (/*…*/)
    {
        _validationDictionary.addError(“Name”, “There is another customer with the same name”); //the _validationDictionary holds the ModelStateWrapper
        return false;
    }
}

Vedi il mio problema?

A seconda della vista, l'errore dovrebbe essere aggiunto con la chiave “BuyingCustomer.Name” O “SellingCustomer.Name” (o eventualmente ci saranno due errori, uno per ciascuna chiave) invece del solo “Nome”;altrimenti il ​​framework non evidenzierà correttamente i campi e mostrerà gli errori.

Qual è il modo corretto per risolvere questa situazione in modo accurato? Non voglio passare il "prefisso della chiave di errore" al livello di servizio, perché è un problema dell'interfaccia utente e non un problema del livello di servizio (giusto?).

È stato utile?

Soluzione

Lo prenderei più tardi, interrogherai il servizio per eventuali errori di convalida?

Eseguire una query sul servizio immediatamente dopo la convalida, quindi reimpostare gli errori oppure fare in modo che il metodo chiami gli errori di convalida restituiti.Se esegui uno di questi, puoi prefissarli con( prefix(this validationDictionaryObject, string pfx) ) un metodo di estensione per il dizionario, l'API non sarebbe poi così male.Un secondo metodo di estensione (HasErrors()) per il dizionario farebbe lo stesso del tuo ritorno booleano

Per il problema che stai riscontrando da solo, tendo a evitare di interrogare il servizio per eventuali errori.

È conveniente che il servizio li raccolga tutti, ma poi stai aggiungendo lo stato di errore a un servizio che non appartiene realmente, non è che il servizio sia interrotto, ma un modello che ha controllato lo era.Se hai bisogno di chiamare di nuovo quel servizio (come stai facendo), il suo stato è vecchio.Devi gestirlo.O quello o restituire errori perché dopo tutto, è un metodo di convalida.Chiedigli di restituire i risultati della convalida.:)

var errs = service.ValidateCustomer(sellinCustomer);
if (errs.HasErrors()){
   errs.Prefix("SellingCustomer");
   //add to model state dictionary for view here.
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top