In ASP.NET MVC mi piace molto la funzionalità che tenta automaticamente di riempire i parametri di un'azione dai valori della richiesta.Modo pulito per evitare l'errore "voce nullo per ID parametro di tipo non annullabile" per i parametri di input
Rende un sacco di cose molto pulite e il mio modello gerarchico per le forme può viaggiare con facilità attraverso il cavo.
C'è comunque un fastidioso problema. L'eccezione automatica per i parametri mancanti non annullabili. Non è che la struttura sia sbagliata. Capisco il ragionamento alla base di questo, ma:
- Ci sono alcuni casi in cui ho una sola int param come input, in cui è richiesto uno specifico oggetto (una pagina dei dettagli di un prodotto, per esempio).
- Il parametro è un parametro GET, quindi è visibile nell'URL ed è facile da modificare.
- Se l'utente cambia il parametro nell'url il server web risponde con una pagina di errore, registra l'errore, ecc
Questo tipo di errore dovrebbe essere gestito bene all'interno dell'applicazione, non ho bisogno di inquinare i miei registri con l'errore, anche un errore 404 per questi casi sarebbe più appropriato IMHO, poiché senza il parametro identificativo "la risorsa non può essere trovata".
Ho alcune idee su come evitare questo, ma voglio qualcosa di trasparente che gestisca questo in un unico posto.
La cosa che ho fatto finora è rendere il parametro int?
.
Non proprio trasparente, ho bisogno di controllare ID.HasValue
ovunque e di lanciare un 404 esplicitamente. Questo inquina la logica di azione.
Qual è il posto migliore per affrontare questo?
EDIT:
Vorrei anche sottolineare che, anche se gettando un HttpException(404,"")
è ancora un'eccezione, ma dal momento che i browser alla ricerca di favicon, ecc e crawler fare un sacco di richieste al cattivi gli URL in ogni caso, tutta la mia registrazione , avvisi, ecc. è configurato di conseguenza.
Sono d'accordo sul fatto che un 404 sarebbe più appropriato. Sarebbe bello se potessi configurare la tua app web per rispondere a percorsi non validi con 404 in produzione. – Sean