ASP.NET MVC incapsula all'interno dell'oggetto ModelMetadata tutte le informazioni relative al model e alle sue proprietà, in modo che possano essere sfruttate da editor e html helper. Questa classe contiene proprietà dai nomi piuttosto esplicativi, come DisplayName, IsRequired, Description, che per default vengono valorizzate in base alle data annotation con cui abbiamo decorato il nostro modello.
In particolare, la proprietà Watermark è agganciata a Display.Prompt e può essere utilizzata per indicare un testo che inviti all'input e ne descriva le caratteristiche:
[DataType(DataType.EmailAddress)] [Display(Name = "Indirizzo email", Prompt = "name@domain")] public string Email { get; set; }
Questa proprietà è ignorata da tutti gli helper e i template inclusi all'interno di ASP.NET MVC, ma ciò non toglie che possiamo sfruttarla tramite un helper personalizzato. Per esempio possiamo creare un overload di TextBoxFor simile al seguente:
public static MvcHtmlString TextBoxFor<TModel, TProperty>( this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes, bool includePlaceholder) { var attributes = new RouteValueDictionary(htmlAttributes); if (includePlaceholder) { var metadata = ModelMetadata.FromLambdaExpression( expression, htmlHelper.ViewData); attributes["placeholder"] = metadata.Watermark; } return htmlHelper.TextBoxFor<TModel, TProperty>(expression, attributes); }
Questo helper prevede un parametro addizionale includePlaceholder. Quando vale true, non facciamo altro che recuperare i metadati della proprietà specificata e aggiungere un attributo placeholder con il testo indicato nel watermark. Il risultato sarà un editor molto più comprensibile e friendly per l'utente:
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare HiLo per ottimizzare le insert in un database con Entity Framework
Usare le collection expression per inizializzare una lista di oggetti in C#
Creazione di plugin per Tailwind CSS: espandere le funzionalità del framework dinamicamente
Gestire domini wildcard in Azure Container Apps
Effettuare lo stream della risposta in ASP.NET Core tramite IAsyncEnumerable
Eseguire attività con Azure Container Jobs
Disabilitare automaticamente un workflow di GitHub (parte 2)
Generare file per il download da Blazor WebAssembly
Eseguire attività basate su eventi con Azure Container Jobs
Sfruttare lo streaming di una chiamata Http da Blazor
Utilizzare l'operatore GroupBy come ultima istruzione di una query LINQ in Entity Framework
Ottimizzazione dei block template in Angular 17
I più letti di oggi
- Tutorial Windows Communication Foundation
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Gestire la cancellazione di una richiesta in streaming da Blazor
- Repository con code-first di Entity Framework
- Blazor: Security
- Utilizzare WebAssembly con .NET, ovunque
- Protobuf: un serializzatore alternativo per WCF