Lo scopo del mio più recente progetto consisteva nell’ integrazione e cooperazione di alcuni webservices in un sistema composito. Il frontend dell’ applicazione prevedeva interrogazioni e modifiche ai dati forniti dai servizi; il binding dei controlli ad associazione dati è stata una delle esperienze più frustranti che abbia mai affrontato. Principalmente il motivo risiedeva nella logica di bind affrontata programmaticamente, cosa che di fatto mi impediva di sfruttare tutte le caratteristiche più comode dei controlli Asp.Net e mi ha costretto a implementare manualmente ordinamenti e filtri . Ora che il progetto è fondamentalmente completato, mi sono preso la briga di indagare più a fondo il problema è ho riscoperto l’amore per l’ ObjectDataSource che, contro ogni buon senso, ho sempre accantonato in favore di SqlDataSource.
A titolo d’ esempio il webservice espone 2 metodi con le seguenti firme:
- public List<Contatti> GetContatti(string username, string password)
- public UpdateContatto(string username, string password, int id_contatto, string nome, string cognome, string city, string nazione, string email, string categoria)
Innanzitutto è necessario scrivere la classe che fungerà da strato intermedio tra presentation layer e datalayer:
Nota: la classe eredita da Page per poter avere accesso agli oggetti User e Profile, tale accorgimento si è reso necessario in quanto il servizio web utilizza un semplice sistema di autenticazione basato sulla trasmissione di username e password in chiaro, dove la password è l’indirizzo email dell’ utente registrato in una proprietà del profilo della Membership.
string _username;
string _passwd;
SRubrica.Service _rubrica; // riferimento al servizio
public ServiceRubricaInvoker(){
_username= User.Identity.Name;
_passwd= Context.Profile.GetPropertyValue(”ServicesToken”).ToString();
}
public IEnumerable getContact(string sortExpression, int maximumRows, int StartRowIndex){
_rubrica= new Service();
Contatti[] cont= _rubrica.getContatti(_username, _passwd);
IEnumerable<Contatti> c1;
if(sortExpression==”")
c1=(IEnumerable<Contatti>)(from c in cont select c);
else{
if(GlobalVar.OldProperty + ” DESC”== sortExpression){
c1=(IEnumerable<Contatti>)(from c in cont orderby c.GetPropertyValue(sortExpression) ascending select c);
c1= c1.Reverse;
GlobalVar.OldProperty=”";
}
else{
c1=(IEnumerable<Contatti>)(from c in cont orderby c.GetPropertyValue(sortExpression) descending select c);
GlobalVar.OldProperty=sortExpression;
}
}
IEnumerable<Contatti> c2 =(IEnumerable<Contatti>) c1.Skip(startRowIndex).Take(maximumRows).ToList();
return c2;
}
public int getCount(){
_rubrica = new Service();
return _rubrica.GetContatti(_username, _passwd).Count();
}
public void updateContatti(int old_IdContatto, string NomeContatto, string CognomeContatto, string CityContatto, string NazioneContatto, string EmailContatto, string categoria, int idContatto){
_rubrica = new Service();
_rubrica.UpdateContatto(_username, _passwd, old_IdContatto, NomeContatto, CognomeContatto, CityContatto, NazioneContatto, EmailContatto, categoria);
}
}
// Questa classe (recuperata dal blog del mitico Andrea Boschin) permette di ordinare i dati in base al parametro sortExpression
public static class ReflectionExtension{
public static object GetPropertyValue(this object value, string propertyName){
Type type= value.GetType();
PropertyInfo property= type.GetProperty(propertyName);
return property.GetValue(value, null);
}
}
Infine colleghiamo la GridView all’ ObjectDataSource:
<asp:GridView ID=”GridView1″ runat=”Server” DataSourceID=”ObjectDataSource1″ DataKeyNames=”IdContatto” AllowSorting=”true” AllowPaging=”true” AutogenerateColumns=”false”>
<Columns>
<asp:CommandField ShowEditButton=”true” />
<asp:BoundField DataField=”IdContatto” HeaderText=” ID” SortExpression=”IdContatto” />
<asp:BoundField DataField=”NomeContatto” HeaderText=”Nome” SortExpression=”NomeContatto” />
<asp:BoundField DataField=”CognomeContatto” HeaderText=” Cognome” SortExpression=”CognomeContatto” />
<asp:BoundField DataField=”CityContatto” HeaderText=” Città” SortExpression=”CityContatto” />
<asp:BoundField DataField=”NazioneContatto” HeaderText=” Nazione” SortExpression=”NazioneContatto” />
<asp:BoundField DataField=”EmailContatto” HeaderText=” Email” SortExpression=”EmailContatto” />
<asp:BoundField DataField=”categoria” HeaderText=” Categoria” SortExpression=”categoria” />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID=”ObjectDataSource” runat=”server” TypeName=”ServiceRubricaInvoker” EnablePaging=”true” MaximumRowsParameterName=”maximumRows” StartRowIndexParameterName=”startRowsIndex” SelectMethod=”getContact” SelectCountMethod=”getCount” SortParameterName=”sortExpression” UpdateMethod=”updateContact” OldValuesParameterFormatString=”old_{0}”>
<UpdateParameters>
<asp:Parameter Name=”old_IdContatto” Type=”Int32″ />
<asp:Parameter Name=”NomeContatto” Type=”String” />
<asp:Parameter Name=”CongomeContatto” Type=”String” />
<asp:Parameter Name=”CityContatto” Type=”String” />
<asp:Parameter Name=”NazioneContatto” Type=”String” />
<asp:Parameter Name=”EmailContatto” Type=”String” />
<asp:Parameter Name=”categoria” Type=”String” />
</UpdateParameters>
</asp:ObjectDataSource>

0 Risposte a “[ GridView ] Binding a un WebService”