Personalizzare il template di edit in ASP.NET Dynamic Data Controls

di Marco De Sanctis, in ASP.NET 3.5 SP 1, Dynamic Data Controls, DataBinding,

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:

C#
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:

C#
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:

C#
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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi