Creare un custom parameter per i Datasource di ASP.NET

di Andrea Zani, in ASP.NET 2.0, Custom Control, DataBinding,

Introdotti dalla versione 2.0 di ASP.NET, i controlli Datasource permettono di estrarre dati e popolare i web control scrivendo il minimo di codice.
Per il passaggio dei parametri, ad esempio per filtrare eventuali query al database, di default abbiamo a disposizione questi oggetti:
- ControlParameter: per leggere valori da property di altri webcontrol;
- CookieParameter: valore da cookie;
- FormParameter: valore da oggetti form passati in modalità POST;
- ProfileParameter: usando Profile API come sorgente;
- QueryStringParameter: dai parametri passati nell'URL di pagina;
- Sessionparameter: dalla Session;
- Parameter: generico, per la definizione manuale di parametri utilizzati.

Anche se la scelta è ampia, possono nascere esigenze che ci obbligano a dover usare trucchi vari. Per esempio, se volessimo utilizzare la data attuale siamo obbligati ad utilizzare, per esempio, una di queste tecniche.

Definendo nella pagina il parameter generico in questo modo:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" 
    SelectCommand="SELECT * FROM [tbl] WHERE ([Date] = @Date)">
  <SelectParameters>            
    <asp:Parameter Name="Data" />
  </SelectParameters>
</asp:SqlDataSource>

Per inserire la data attuale possiamo inserire il suo valore nel 'DefaultValue' del parameter dall'evento Page_Load:

void Page_Load()
{
  SqlDataSource1.SelectParameters["Data"].DefaultValue = DateTime.Now.ToShortDateString();
}

Oppure con l'evento OnSelecting:

protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
  e.Command.Parameters["@Data"].Value = DateTime.Now;
}

Un'alternativa, senza molti sfonzi, consiste nel creare un nostro oggetto Parameter personalizzato. Creata una classe - anche in App_Code - con questa struttura:

using System;
using System.Web;

namespace AZControls
{
  public class MyParameter : System.Web.UI.WebControls.Parameter
  {
    protected override object Evaluate(HttpContext context, System.Web.UI.Control control)
    {
      return DateTime.Now;
    }
  }
}

Per utilizzarla nella pagina dobbiamo aggiungere ad inizio del codice della stessa:

<%@ Page Language="C#" %>
<%@ Register Namespace="AZControls" TagPrefix="az" %>

E, supponendo di utilizzare un SqlDataSource:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString2 %>" 
    SelectCommand="SELECT * FROM [tbl] WHERE ([Data] = @Data)">
  <SelectParameters>            
    <az:MyParameter Name="Data" />
  </SelectParameters>
</asp:SqlDataSource>

Se volessimo aggiungere property aggiuntive, visualizzate anche dall'intellisense di Visual Studio, bisogna procedere in questo modo:

using System;
using System.Web;

namespace AZControls
{
  public class MyParameter : System.Web.UI.WebControls.Parameter
  {
    protected override object Evaluate(HttpContext context, System.Web.UI.Control control)
    {
      ...
      string cc=CultureCode;
      ...
    }
    private string _CultureDate;
    public string CultureDate;
    {
      get { return _CultureDate; }
      set { _CultureDate=value; }
    }
  }
}

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