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 l'operatore GroupBy come ultima istruzione di una query LINQ in Entity Framework
Evitare il flickering dei componenti nel prerender di Blazor 8
Gestire errori funzionali tramite exception in ASP.NET Core Web API
Ottimizzare il mapping di liste di tipi semplici con Entity Framework Core
Limitare le richieste lato server con l'interactive routing di Blazor 8
Usare il versioning con i controller di ASP.NET Core Web API
Evitare la script injection nelle GitHub Actions
Implementare il throttling in ASP.NET Core
Usare le variabili per personalizzare gli stili CSS
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Paginare i risultati con QuickGrid in Blazor
Gestire domini wildcard in Azure Container Apps
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!
- Gli oggetti CallOut di Expression Blend 4.0
- Repository con code-first di Entity Framework
- Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary