Come sappiamo, quando vogliamo disabilitare un elemento di input in pagina, specificare l'attributo disabled sfruttando un apposito overload degli html helper di ASP.NET MVC:
@Html.TextBoxFor(x => x.FirstName, new { disabled = "disabled" })
In particolare, questi metodi richiedono un anonymous type, il cui utilizzo può risultare scomodo se la disabilitazione deve avvenire in base a una particolare condizione del View Model (per esempio l'utente ha privilegi di sola lettura sul dato). In questi casi, un helper come quello seguente migliora sensibilmente la situazione:
public static class Utilities { public static RouteValueDictionary DisableWhen(this object source, bool condition) { var result = HtmlHelper.AnonymousObjectToHtmlAttributes(source); if (condition) { result.Add("disabled", "disabled"); } return result; } }
Si tratta di un extension method della classe object, da applicare quindi all'anonymous type definito per gli attributi, che inizialmente trasforma l'oggetto in input nel corrispondente RouteValueDictionary di coppie chiave-valore e che, successivamente, aggiunge l'attributo disabled nel caso la condizione sia verificata.
Grazie a questo metodo, il codice da scrivere sulla view diventa davvero semplice e di immediata compresione:
@Html.TextBoxFor(x => x.SomeField, new { @class = "myClass" }.DisableWhen(this.Model.CanEdit)) />
L'effetto finale di emettere un oggetto disabled in pagina è che il suo contenuto viene ignorato dal browser in fase di post. Attenzione però a non fidarsi mai dell'input proveniente dal browser e a verificare la condizione anche lato server, visto che comunque l'utente potrebbe aver modificato il markup della pagina o inviato manualmente la form.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Ottimizzare il mapping di liste di tipi semplici con Entity Framework Core
Testare l'invio dei messaggi con Event Hubs Data Explorer
Aggiornare a .NET 9 su Azure App Service
Miglioramenti nelle performance di Angular 16
Usare una container image come runner di GitHub Actions
Eliminare una project wiki di Azure DevOps
Utilizzare i primary constructor di C# per inizializzare le proprietà
Recuperare l'ultima versione di una release di GitHub
Configurare lo startup di applicazioni server e client con .NET Aspire
Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
Utilizzare la funzione EF.Parameter per forzare la parametrizzazione di una costante con Entity Framework
Creare una custom property in GitHub