ModelState Validation vs JQuery vs Remote

1

Sono rimasto bloccato con alcune convalide per un po 'di tempo. Ho cercato a fondo su Internet per trovare modi per applicare le convalide che ho bisogno. Ho trovato molti metodi per convalidare anche alcuni pacchetti di Nuget. Ma nella maggior parte dei casi il mio requisito non era soddisfatto. Ho fatto una validazione remota, che per me era la più facile da comprendere. Ma in alcuni casi non mi ha dato i risultati attesi.

Ho ricevuto suggerimenti da molti che mi chiedono di eseguire la validazione lato client usando Jquery e lasciando la convalida lato server per il momento (la maggior parte dei consigli non erano abbastanza chiari per me, non sono mai stato allo sviluppo web prima). Essendo queste lingue davvero difficili da capire, ho dovuto continuare a cercare modi per ottenere le mie cose. Forse ero alla ricerca del modo più semplice per fare una convalida.

Finalmente ho avuto successo nell'ottenere l'output desiderato convalidando i miei dati nel metodo di azione del controller. Non sono sicuro che sia un metodo convenzionale da seguire o se finirei con conseguenze gravi in una fase successiva.

Quindi ora mi sto davvero chiedendo perché nessuno mi ha consigliato di fare la validazione nel metodo di azione quando è possibile !! Il mio approccio è giusto per fare una valutazione. Solo per riferimento sto aggiungendo la convalida che ho fatto.

   if (ModelState.IsValid)
   {
       if (db.SystemFamily.Any(x => x.FamilyName.Equals(systemFamily.FamilyName)))
       {
          ModelState.AddModelError("FamilyName", "Already exists");
          return View(systemFamily);
       }
       else
       {
          systemFamily.DateCreated = DateTime.Now;
          systemFamily.CreatedBy = User.Identity.Name;
          db.SystemFamily.Add(systemFamily);
          db.SaveChanges();
          return RedirectToAction("Index");
       }
   }

Sto cercando difetti nel mio approccio e la possibile alternativa più semplice per il mio compito.

    
posta Vini 02.10.2015 - 13:38
fonte

2 risposte

0

La convalida può essere eseguita in molti modi diversi. Ogni modo ha i suoi svantaggi e vantaggi.

La convalida del frontend è molto veloce. Offre la migliore esperienza utente, dal momento che è possibile fornire un feedback immediato all'utente (anche quando digita). Tuttavia, un utente intelligente può modificare la propria pagina Web per modificare o disabilitare in modo efficace la logica di convalida. Questo non è sicuro, ma è bello da usare.

La convalida del backend è più sicura. Assicura che nessun dato non valido riesca a superarlo. Indipendentemente da quanto un utente intelligente modifica la propria pagina Web, i dati inviati vengono convalidati dal back-end.
Tuttavia, la convalida del backend richiede un round trip al server. Ciò significa che l'utente potrebbe inserire un modulo, inviarlo, attendere il caricamento della pagina, solo per poi rendersi conto che ha fatto un errore da qualche parte. Questo è sicuro, ma non è (altrettanto) piacevole da usare.

L'opzione superiore è di avere entrambe le convalide contemporaneamente. La convalida del frontend massimizza l'esperienza dell'utente. La convalida del backend di solito passa poiché il frontend previene già l'invio di valori non validi. Tuttavia, se un hacker intelligente trova un modo per aggirare la logica di validazione del frontend, allora sono ancora fermati dalla logica del backend validiton (che non possono eludere).
Tuttavia, lo svantaggio di farlo è che ti stai ripetendo, e sarà più fastidioso dover cambiare due parti separate della logica di convalida ogni volta che qualcosa cambia. Se le due regole di convalida non sono sincronizzate, creerai un'esperienza utente orribile.

Quindi, la domanda è quali sono le tue due priorità principali:

  • Sicurezza + esperienza utente : utilizza entrambe le convalide. Non sarà facile da sviluppare o mantenere.
  • Sicurezza + facilità di sviluppo : utilizza la convalida del backend. Non avrà la migliore esperienza utente.
  • Esperienza utente + facilità di sviluppo : utilizza la convalida del frontend. Non sarà sicuro.

Non starei solo usando la convalida del frontend, a meno che tu non sia preoccupato per l'uso dannoso del tuo sito web (ad esempio un'applicazione intranet senza reali responsabilità).

    
risposta data 28.05.2018 - 16:13
fonte
0

Tecnicamente è possibile eseguire la quasi ovunque. È lo scopo della convalida che determina dove dovresti posizionarlo, e se vuoi un sito / app robusto e facile da usare, allora potresti aver bisogno di tutti dei diversi tipi di convalida.

Per avvisare gli utenti di quali dati di tipo devono inserire, è necessario Convalida del front end con una qualche forma di JavaScript. Se non hai la convalida Front End, l'utente non si renderà conto che c'è un problema con il loro input fino a quando non invierà il modulo, che è altamente fastidioso per loro e può causare problemi di stato per te. JavaScript viene eseguito sul browser degli utenti, pertanto la convalida qui consente di avvisare l'utente dei problemi mentre compila i dati (password troppo breve ecc.).

Poiché JavaScript viene eseguito sul PC dell'utente, ciò significa che non ci si può fidare di esso. Gli utenti possono disabilitarlo, aggirarlo o addirittura modificarlo, il che significa che devi avere Convalida lato server per garantire che i dati siano nel formato che ti aspetti e che possano funzionare. Esistono molti altri modi per implementare la convalida lato server.

Tecnicamente in MVC puoi fare un controllo nell'Azione, ma questo non è necessariamente il posto migliore per farlo. Per molte definizioni di base (tipo di dati, lunghezza minima, ecc.), Dovresti cercare di gestirlo in Modello invece . In effetti stai già controllando ModelState.IsValid, quindi se puoi definire la convalida nel Modello, il tuo codice funzionerà già. Potresti anche avere una classe con la sua logica di convalida con cui puoi interagire.

Un altro scopo di convalida è l'integrità dei dati del tuo database. Questo tipo di convalida è meglio inserire nel database stesso, o forse nelle procedure di aggiornamento che è possibile chiamare. Questa potrebbe essere la fonte della tua confusione. Se stai cercando di impedire voci duplicate nel tuo database, sarebbe meglio rendere FamilyName una chiave nel database, il che farà sì che qualsiasi tentativo di inserire una nuova riga con lo stesso FamilyName fallisca. È quindi possibile rilevare tale eccezione e informare l'utente che esiste già, piuttosto che verificare preventivamente se la riga esiste già prima di provare a salvare nel database.

    
risposta data 25.09.2018 - 21:19
fonte

Leggi altre domande sui tag