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.