25 messaggi dal 14 luglio 2011
ciao a tutti, devo effettuare un databind di una label attraverso un objectdatasource..se il metodo ritorna un intero come cosa devo mettere in "Eval"??:

<asp:FormView ID="FrmViewRankingFirst" runat="server" DataSourceID="NotificationRankFirstDataSource" 
                AllowPaging="True">
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%#Eval("COSA METTO??")%>'/>
                </ItemTemplate>
            </asp:FormView>



<asp:ObjectDataSource   
            ID="NotificationRankFirstDataSource"  
            runat="server"  
            TypeName="Fifa.Business.RankingManager"  
            SelectMethod="GetFirst"  
            >  
        </asp:ObjectDataSource> 


 public Int32 GetFirst()
        {

            ISession session = SessionHelper.OpenSession();
            IList<Int32> sql = session.CreateSQLQuery("Select vinte as First from qr_classifica where NotificationRank=1").List<Int32>();
            return sql[0];
        }


grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
potresti usare Container.DataItem.

<asp:Label ID="Label1" runat="server" Text='<%# Container.DataItem %>'/>


Tuttavia... ti funziona quel codice? Credo che il SelectMethod debba restituire un qualcosa di enumerabile (cioè che implementi IEnumerable) e non un valore scalare.

Se non dovesse funzionare, prova così, usando la funzione .Take di LINQ per restare con una lista composta da un solo elemento:
 public IEnumerable<Int32> GetFirst()
        {

            ISession session = SessionHelper.OpenSession();
            return session.CreateSQLQuery("Select vinte as First from qr_classifica where NotificationRank=1").List<Int32>().Take(1);
        }


Sicuramente non ho il quadro completo della situazione, ma non sarebbe più semplice fare a meno del FormView e dell'ObjectDataSource? Potresti assegnare il valore alla Label direttamente.

<asp:Label ID="Label1" runat="server" OnLoad="GetFirst" />

e quindi la funzione:
 public void GetFirst(object sender, EventArgs e)
        {
            ISession session = SessionHelper.OpenSession();
            IList<Int32> sql = session.CreateSQLQuery("Select vinte as First from qr_classifica where NotificationRank=1").List<Int32>();
            (sender as Label).Text = sql[0].ToString();
        }


ciao,
Modificato da BrightSoul il 19 ottobre 2011 20.54 -

Enjoy learning and just keep making
25 messaggi dal 14 luglio 2011
ciao, prima di tutto ti ringrazio per le risposte, in secondo luogo non mi funziona, mi spiego:

1)
<asp:Label ID="Label1" runat="server" Text='<%# Container.DataItem %>'/>


Al posto di Container ho sostituito l'id del mio objectdatasource, ma mi viene restituito che ObjectDataSource non contiene una definizione di 'DataItem'.

2) Utilizzando un metodo che torna un IEnumerable e impostando la label così
<asp:Label ID="Label2" runat="server" Text='<%# Eval("First")%>'/>

Etra nel metodo solo che poi non riconosce "First".. sbaglio forse definendo Eval?

3)Utilizzando il terzo metodo e definendo la label così:
<asp:Label ID="Label1" runat="server" OnLoad="Fifa.Business.RankingManager.GetFirst()" />

mi restituisce:
CS1061: 'ASP.index_aspx' non contiene una definizione di 'Fifa' e non è stato trovato alcun metodo di estensione 'Fifa' che accetta un primo argomento di tipo 'ASP.index_aspx'. Probabilmente manca una direttiva using o un riferimento a un assembly.

Qualche idea? grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, le modifiche ai punti 1 e 2 vanno eseguite entrambe, altrimenti l'errore persiste.
  • 1. "Container.DataItem" va scritto così letteralmente, non va sostituito con l'ID del tuo ObjectDataSource. La tua Label deve essere esattamente così.
    <asp:Label ID="Label1" runat="server" Text='<%# Container.DataItem %>'/>
    Per maggiori informazioni sul Contaienr, puoi leggere questo articolo di Daniele.
    http://www.aspitalia.com/script/638/Tecnica-Migliore-Databinding-Controls-ASP.NET.aspx
  • 2. La funzione GetFirst va modificata così:
     public IEnumerable<Int32> GetFirst()
            {
    
                ISession session = SessionHelper.OpenSession();
                return session.CreateSQLQuery("Select vinte as First from qr_classifica where NotificationRank=1").List<Int32>().Take(1);
            }
    



Mentre, volendo usare l'altro sistema cioè quello più semplice che richiede solo una Label, senza FormView o ObjectDataSource, allora fai in modo che la tua label sia esattamente così (nota come non ci siano le parentesi dopo "GetFirst"):
<asp:Label ID="Label1" runat="server" OnLoad="GetFirst" />
Quindi nel codefile (il file .cs associato alla pagina), aggiungi questo metodo.

protected void GetFirst(object sender, EventArgs e)
        {
            ISession session = SessionHelper.OpenSession();
            IList<Int32> sql = session.CreateSQLQuery("Select vinte as First from qr_classifica where NotificationRank=1").List<Int32>();
            (sender as Label).Text = sql[0].ToString();
        }


ciao,
Modificato da BrightSoul il 20 ottobre 2011 13.55 -

Enjoy learning and just keep making
25 messaggi dal 14 luglio 2011
Ciao, i metodi da te proposti funzionano.. giusto per non limitarmi ad un copia incolla inutile vorrei farti alcune considerazioni:

. Alternativa 1 =>
<asp:Label ID="Label1" runat="server" OnLoad="GetFirst" />

Con inserimento del metodo nel codefile della pagina: direi di escluderlo, essendo una applicazione n-tier verrebbero a meno le regole che governano l'applicazione, i manager vanno nella Business logic e quindi non hanno spazio nella Presentation.

. Alternativa 2 =>
Utilizzo dell'oggetto <asp:Repeater> al posto di <asp:Formview> e metodo che ritorna:

1) IEnumerable
public IEnumerable<string> GetFirst()
        {

            ISession session = SessionHelper.OpenSession();
            return session.CreateSQLQuery("Select squadra as First from qr_classifica where NotificationRank=1").List<string>().Take(1);
        }


Il metodo Enumerable.Take mi permette di definire il numero di elementi che verranno restituiti, ma sapendo a priori che dovrò avere necessariamente sempre e solo un oggetto mi sembra sconsigliabile in questo caso.

2)public Ilist IList<RankingManager> GetFirst()
In questo caso di tratta di collection personalizzate e quindi di appoggiarmi al mio dominio. Questa scelta sarebbe a mio parere la migliore per come è strutturata l'applicazione, cioè n-tier+nhibernate, però non saprei come fare dato che la query diretta sul db mi restituirà sempre e solo un campo calcolato.

3) public IList<string> GetFirst()
In questo caso mi faccio tornare una oggetto generico list già castato.

Io opterei per questo terza opzione, ma vorrei sapere se esiste una regola generale sul bind attraverso nhibernate su oggetti asp.net

GRAZIE PER L'AIUTO!
11.886 messaggi dal 09 febbraio 2002
Contributi
cleaner ha scritto:
Con inserimento del metodo nel codefile della pagina: direi di escluderlo, essendo una applicazione n-tier verrebbero a meno le regole che governano l'applicazione, i manager vanno nella Business logic e quindi non hanno spazio nella Presentation.

certo, ma più che escluderlo puoi adattarlo. Ora che hai verificato che il metodo nel codefile funziona, fagli invocare il metodo che hai nello strato della business logic.

protected void GetFirst(object sender, EventArgs e)
        {
            (sender as Label).Text = Fifa.Business.RankingManager.GetFirst().ToString();
        }



Passiamo all'altra soluzione.

cleaner ha scritto:

2)public Ilist IList<RankingManager> GetFirst()
In questo caso di tratta di collection personalizzate e quindi di appoggiarmi al mio dominio. Questa scelta sarebbe a mio parere la migliore per come è strutturata l'applicazione, cioè n-tier+nhibernate, però non saprei come fare dato che la query diretta sul db mi restituirà sempre e solo un campo calcolato.

Nello strato di presentazione, ovvero nel codefile della tua pagina aspx, puoi semplicemente raccogliere il valore scalare che ti arriva dal metodo della business logic e poi inserirlo in una lista al solo fine di effettuare il databinding.
var valore = Fifa.Business.RankingManager.GetFirst();
//qui aggiungo il valore in un array e lo passo al repeater come DataSource
tuoRepeater.DataSource = new[] {valore}; 
tuoRepeater.DataBind();

Ad ogni modo, ripeto che non è necessario usare un databound control come il Repeater per visualizzare un solo valore scalare. E' sufficiente assegnare tale valore alla proprietà .Text di una Label.

ciao,
Modificato da BrightSoul il 22 ottobre 2011 00.19 -

Enjoy learning and just keep making
25 messaggi dal 14 luglio 2011
ok a posto grazie mille per il supporto.
Ora ho le idee più chiare.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.