Nello script #1006 abbiamo visto come sia semplice personalizzare il template di visualizzazione di un dato in ASP.NET Dynamic Data Controls, semplicemente creando uno User Control e referenziandolo a livello di metadati tramite l'attributo UIHint.
Il medesimo procedimento si applica anche nel caso del template di modifica, al cui nome dobbiamo aggiungere però il suffisso "_Edit" come mostrato in figura:
Nel nostro caso, il markup che vogliamo realizzare per modificare un dato di tipo "Sesso" è costituito da una DropDownList, che conterrà le possibili opzioni, e da un paio di controlli validator:
<asp:DropDownList runat="server" ID="ddlGender" /> <asp:RequiredFieldValidator runat="server" ID="requiredValidator" CssClass="droplist" ControlToValidate="ddlGender" Display="Dynamic" Enabled="false" /> <asp:DynamicValidator runat="server" ID="validator" CssClass="droplist" ControlToValidate="ddlGender" Display="Dynamic" />
Questi ultimi vengono automaticamente configurati dall'infrastruttura dei Dynamic Data Controls in base ai metadati impostati sul model, come abbiamo visto nello script #1004, grazie all'invocazione del metodo SetupValidator sul Page_Load del nostro template:
protected void Page_Load(object sender, EventArgs e) { if (this.ddlGender.Items.Count == 0) { this.ddlGender.Items.Add(new ListItem( this.Column.IsRequired ? "[Selezionare]" : "[Non definito]", string.Empty)); this.ddlGender.Items.Add(new ListItem("Maschio", "M")); this.ddlGender.Items.Add(new ListItem("Femmina", "F")); } SetUpValidator(this.requiredValidator); SetUpValidator(this.validator); }
Come si può notare dal codice in alto, le potenzialità racchiuse nei custom template sono veramente ampie, visto che comunque si tratta di veri e propri UserControl a cui possiamo applicare logiche a piacimento: ad esempio, nel caso in esame abbiamo sfruttato il medesimo evento di Load anche per popolare la DropDownList in maniera differente a seconda del fatto che la proprietà da editare sia obbligatoria oppure no. Ciò è facilmente implementabile interrogando la proprietà Column, che fornisce tutta una serie di informazioni sui metadati ti tale proprietà: se si tratta di una foreign key, se è in sola lettura o quali sono gli attributi con cui è decorata.
Definita l'interfaccia, il passaggio successivo consiste nel valorizzare la DropDownList con l'eventuale valore già presente sul model, effettuando l'override del metodo OnDataBinding:
protected override void OnDataBinding(EventArgs e) { base.OnDataBinding(e); if (this.Mode == DataBoundControlMode.Edit) { // solo se sono in edit recupero il valore corrente string value = this.FieldValue as string; var item = this.ddlGender.Items.FindByValue(value); if (item != null) item.Selected = true; } }
A questo punto, per completare la funzionalità di Edit, non resta che specificare come Dynamic Data Controls deve recuperare il nuovo valore selezionato dall'utente:
protected override void ExtractValues(IOrderedDictionary dictionary) { base.ExtractValues(dictionary); string value = this.ddlGender.SelectedValue; if (value == "F" || value == "M") dictionary[Column.Name] = value; else dictionary[Column.Name] = null; }
L'effetto finale è quello mostrato in figura:
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Load test di ASP.NET Core con k6
Eseguire un metodo asincrono dopo il set di una proprietà in Blazor 8
Implementare il throttling in ASP.NET Core
Short-circuiting della Pipeline in ASP.NET Core
Utilizzare la libreria Benchmark.NET per misurare le performance
Effettuare il binding di date in Blazor
I più letti di oggi
- Miglioramenti nelle performance di Angular 16
- Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
- HTML5 con CSS e JavaScript
- Ottimizzazione dei block template in Angular 17
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!