Un custom Parameter per utilizzare come valore un metodo della pagina ASP.NET

di Marco Leoncini, in ASP.NET 2.0, DataBinding, Custom Controls,

Nello script #921 abbiamo visto come impostare a runtime il valore del parametro utilizzato nell'operazione di selezione.

Benché appropriata, alla lunga questa tecnica può essere ripetitiva e poco portabile, ed a questo scopo estenderemo la classe Parameter per richiamate un metodo della pagina.

Per prima cosa aggiungiamo la proprietà di tipo string per specificare il nome del parametro da richiamare.

public class PageMethodParameter : Parameter
{
  public string MethodName
  {
    get 
    {
      string _value = (string)ViewState["MethodName"];

      if (!string.IsNullOrEmpty(_value))
        return _value;

      throw new Exception("Nessun metodo specificato");
    }
    set 
    {
      ViewState["MethodName"] = value;
    }
  }
}

In seguito eseguiamo l'override del metodo Evaluate, dove tramite Reflection andremo ad invocare il metodo della pagina.

protected override object Evaluate(HttpContext context, Control control)
{
  if (_callPageMethod)
  {
    if (control == null)
      throw new ArgumentNullException("control");

    Type _pageType = control.Page.GetType();

    MethodInfo _methodInfo = _pageType.GetMethod(MethodName);

    if (_methodInfo == null)
      throw new Exception(string.Format("Impossibile recuperare il metodo {0} da invocare", MethodName));

    return _methodInfo.Invoke(control.Page, null);
  }

  _callPageMethod = true;

  return null;

}

La chiamata al metodo è subordinata al valore di un campo di tipo bool, accorgimento necessario per evitare una doppia chiamata.
Infatti il metodo Evaluate viene richiamato la prima volta durante la fase di inizializzazione dell'ObjectDataSource e memorizzato nel ViewState, successivamente avviene la chiamata generata da una delle operazioni possibili tra Select, Insert, Delete e Update.
Infine, vista la possibilità che l'oggetto restituito dal metodo invocato non sia serializzabile, il riferimento nel ViewState viene impostato a null.

protected override object SaveViewState()
{
  ViewState["ParameterValue"] = null;
  return base.SaveViewState();
}

Per poter utilizzare il nuovo Parameter è sufficiente registrarlo come qualsiasi altro custom control e poi nella pagina fare riferimento a quest'ultimo all'interno della dichiarazione dei parametri.

Approfondimenti


#921 - Specificare un tipo custom come valore di un parametro di selezione dell'ObjectDataSource
https://www.aspitalia.com/script/921/Specificare-Tipo-Custom-Valore-Parametro-Selezione-ObjectDataSource.aspx

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