Ecco un bel servizio per creare macchine virtuali vuote per Vmware: http://www.easyvmx.com/
Se hai vmware player e vuoi installare una nuova macchina virtuale, ti serve la coppia Vmx (macchine virtuale) + Vmdk (disco virtuale). Ma con vmware player non è possibile creare nuove macchine virtuali. Con il servizio EasyVmx puoi crearti la macchina virtuale che ti serve. Ovviamente vuota! Il sistema operativo te lo devi installare tu.
martedì, dicembre 30, 2008
lunedì, dicembre 22, 2008
Link: SQL Server 2005 Backups
Ecco un bell'articolo sulle varie possibilità di backup in sql 2005:
http://www.simple-talk.com/content/article.aspx?article=322
Tra le altre cose è descritta molto bene l'opzione COPY_ONLY. Da leggere.
http://www.simple-talk.com/content/article.aspx?article=322
Tra le altre cose è descritta molto bene l'opzione COPY_ONLY. Da leggere.
venerdì, novembre 21, 2008
System.Web.UI.WebControls.Parameter ..... DbType !
SFOGO!
Ma porca la put...a! E' mai possibile sapere le cose in modo semplice senza diventare matti con Reflector, pezzi di blog e ammenicoli vari?!?!?
Iniziamo: ambiente di sviluppo VS2005 su Vista. Un bel SqlDataSource su pagina asp.net e un po' di parametri di update ed insert. Niente di strano. Incomiciano le cose strane. Una proprità nuova... non la ricordavo... DbType sui parametri. Qualche problema con le date e poi funziona tutto. Ho un po' di fretta e non indago troppo (mannaggia a me!).
Dopo un po' di giorni, faccio un deploy su Win2003 server. E mi becco subito un bel errore:
Type 'System.Web.UI.WebControls.Parameter' does not have a public property named 'DbType'.
Ma come è possibile? Net 2.0 su Vista, Net 2.0 in Win2003... boh! Dopo un po' di prove mia affido a Reflector e sorpresa: la classe System.Web.UI.WebControls.Parameter su Vista è diversa dalla classe System.Web.UI.WebControls.Parameter su Win2003. C'è una proprietà in più: DbType. Ovviamente ci sono anche i vari costruttori per poterla gestire.
Cerca, cerca, cerca e su MSDN, alla pagina http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.parameter.dbtype.aspx al fondo mi casca l'occhio su una cosa strana:
Supported in: 3.5 SP1, 3.0 SP2, 2.0 SP2
Ma da quando c'è Net 2.0 Sp2? Mi sono perso qualcosa? Sembrerebbe di si... ma... cercando ancora su Google viene fuori che Net 2.0 Sp2 non esiste come pacchetto a se stante ma viene installato da... Net 3.5 SP1! Ma porca la put....!
Fine dello sfogo!
PS: ok, è anche colpa mia... nella fretta non ho indagato sul quel parametro DbType... avrei dovuto farlo. Mea culpa!
Ma porca la put...a! E' mai possibile sapere le cose in modo semplice senza diventare matti con Reflector, pezzi di blog e ammenicoli vari?!?!?
Iniziamo: ambiente di sviluppo VS2005 su Vista. Un bel SqlDataSource su pagina asp.net e un po' di parametri di update ed insert. Niente di strano. Incomiciano le cose strane. Una proprità nuova... non la ricordavo... DbType sui parametri. Qualche problema con le date e poi funziona tutto. Ho un po' di fretta e non indago troppo (mannaggia a me!).
Dopo un po' di giorni, faccio un deploy su Win2003 server. E mi becco subito un bel errore:
Type 'System.Web.UI.WebControls.Parameter' does not have a public property named 'DbType'.
Ma come è possibile? Net 2.0 su Vista, Net 2.0 in Win2003... boh! Dopo un po' di prove mia affido a Reflector e sorpresa: la classe System.Web.UI.WebControls.Parameter su Vista è diversa dalla classe System.Web.UI.WebControls.Parameter su Win2003. C'è una proprietà in più: DbType. Ovviamente ci sono anche i vari costruttori per poterla gestire.
Cerca, cerca, cerca e su MSDN, alla pagina http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.parameter.dbtype.aspx al fondo mi casca l'occhio su una cosa strana:
Supported in: 3.5 SP1, 3.0 SP2, 2.0 SP2
Ma da quando c'è Net 2.0 Sp2? Mi sono perso qualcosa? Sembrerebbe di si... ma... cercando ancora su Google viene fuori che Net 2.0 Sp2 non esiste come pacchetto a se stante ma viene installato da... Net 3.5 SP1! Ma porca la put....!
Fine dello sfogo!
PS: ok, è anche colpa mia... nella fretta non ho indagato sul quel parametro DbType... avrei dovuto farlo. Mea culpa!
venerdì, ottobre 24, 2008
Pdf2AfpLib - alpha release
I've released on SourceForge the alpha version of Pdf2AfpLib. http://sourceforge.net/projects/pdf2afplib/
Pdf2AfpLib is a library for converting Pdf files to Afp files. It's written in C# and uses Ghostscript for a part of the conversion process. At the moment it generates only black and white Afp files. No gray scale, no color.
Important: all the content is rasterized. In the resulting afp file, every page contains only one big image that completely covers the page.
The conversion runs through 2 steps:
At the moment you can download the source code only from the Subversion repository on SourceForge.
Repository URL: https://pdf2afplib.svn.sourceforge.net/svnroot/pdf2afplib/
If you want to browse it: http://pdf2afplib.svn.sourceforge.net/viewvc/pdf2afplib/trunk/
Pdf2AfpLib is a library for converting Pdf files to Afp files. It's written in C# and uses Ghostscript for a part of the conversion process. At the moment it generates only black and white Afp files. No gray scale, no color.
Important: all the content is rasterized. In the resulting afp file, every page contains only one big image that completely covers the page.
The conversion runs through 2 steps:
- Pdf is converted to tiff G3 files using Ghostscript. One tiff for each page.
- Tiff are parsed and the image content is imported as an IOCA image in the output afp.
At the moment you can download the source code only from the Subversion repository on SourceForge.
Repository URL: https://pdf2afplib.svn.sourceforge.net/svnroot/pdf2afplib/
If you want to browse it: http://pdf2afplib.svn.sourceforge.net/viewvc/pdf2afplib/trunk/
domenica, ottobre 12, 2008
IEC16022Sharp 0.3.6.0
Iec16022Sharp 0.3.6.0 released.
Added HexPbm output support (by Andrew Francis)
https://sourceforge.net/projects/iec16022sharp/
Added HexPbm output support (by Andrew Francis)
https://sourceforge.net/projects/iec16022sharp/
giovedì, agosto 21, 2008
Post di Rick Strahl su Asp.Net
Un bel post di Rick Strahl su Asp.Net e sulla politica di Microsoft. Molto lungo ma molto interessante. Da leggere.
http://west-wind.com/weblog/posts/453551.aspx
http://west-wind.com/weblog/posts/453551.aspx
martedì, luglio 15, 2008
Normalizzazione di database
Questo post è dedicato a Guerrino.
Non voglio scrivere l'ennesimo post sulla denormalizzazione dei database. L'argomento è ampiamente trattato da esperti e guru. Un giro con Google e si trovano centinaia di voci. Voglio comunque segnalare il recente articolo di Jeff Atwood Maybe Normalizing Isn't Normal. Merita una lettura attenta.
Ci tenevo invece a riportare un paio di frasi ad effetto di Pat Helland
PS: non sono un fan sfegatato della denormalizzazione. Anzi ritengo che i casi in cui la si possa o debba applicare in modo massiccio sono realmente pochi. D'altra parte non sono neanche un sostenitore della normalizzazione a tutti i costi. In un futuro post (tempo permettendo) cercherò di fare la mia list di tips sull'argomento.
Non voglio scrivere l'ennesimo post sulla denormalizzazione dei database. L'argomento è ampiamente trattato da esperti e guru. Un giro con Google e si trovano centinaia di voci. Voglio comunque segnalare il recente articolo di Jeff Atwood Maybe Normalizing Isn't Normal. Merita una lettura attenta.
Ci tenevo invece a riportare un paio di frasi ad effetto di Pat Helland
"Normalization is for Sissies"
"People normalize because their professor said to"
La prima è una provocazione. La seconda invece ci dovrebbe far pensare..... quante volte si fanno le cose in un certo modo perchè qualcuno di "autorevole" (o autoritario?) ci ha detto che così si deve fare?
PS: non sono un fan sfegatato della denormalizzazione. Anzi ritengo che i casi in cui la si possa o debba applicare in modo massiccio sono realmente pochi. D'altra parte non sono neanche un sostenitore della normalizzazione a tutti i costi. In un futuro post (tempo permettendo) cercherò di fare la mia list di tips sull'argomento.
giovedì, luglio 10, 2008
Bug generalizzato - DNS cache poisoning
In questi giorni sono state rilasciate varie patch da molti grossi nomi: Microsoft, Cisco, Sun, ecc.
Le patch correggono un bug nell'implementazione e, se ho capito bene, nell'uso dei server DNS. Lo scopritore del problema è Dan Kaminsky che sul suo blog ha pubblicato un interessante articolo in cui racconta lo sforzo congiunto di vari produttori per far fronte al problema: http://www.doxpara.com/?p=1162
Per i dettagli tecnici, vedere l'articolo su CERT: http://www.kb.cert.org/vuls/id/800113
Sempre nell'articolo del CERT è presente la lista dei sistemi coinvolti. Praticamente tutti, in varie forme:Microsoft, Cisco, Sun, Debian, RedHat, ecc. Altri sono ancora Unknown. Vedremo che cosa succederà nei prossimi giorni.
Molti dettagli tecnici sono presenti anche sul Advisory di Cisco: http://www.cisco.com/en/US/products/products_security_advisory09186a00809c2168.shtml
C'è però una cosa che non mi è ancora chiara: lo stato di Debian. Leggendo i vari avvisi presenti sul loro sito sembra che il problema su BIND sia stato risolto ma non quello "lato client". Vedi http://www.debian.org/security/2008/dsa-1605
Ad oggi, l'unico sistema ad ampia diffusione che sembra immune dal problema è Vista (almeno stando al bollettino di Microsoft).
UPDATE1: la cosa simpatica (si fa per dire) è che sembra che il problema fosse già stato evidenziato ben 3 anni addietro. Ecco il documento su SANS: http://www.sans.org/reading_room/whitepapers/dns/1567.php
Il documento è molto interessante perchè spiega nel dettaglio come avviene l'attaco. Si tratta di un classico attacco "Man in the middle". Come client viene usato Windows XP ma, come abbiamo visto in questi giorni, il problema è generalizzato.
UPDATE2: altro post molto interessante:
http://blog.netherlabs.nl/articles/2008/07/09/some-thoughts-on-the-recent-dns-vulnerability
Bert Hubert, l'autore, oltre a sostenere che il problema fosse noto dal 1999, fa anche alcune interessanti riflessioni sul DNS in se e su come certi enti non siano stati in gradi di reagire per tempo. Molto interessante.
Le patch correggono un bug nell'implementazione e, se ho capito bene, nell'uso dei server DNS. Lo scopritore del problema è Dan Kaminsky che sul suo blog ha pubblicato un interessante articolo in cui racconta lo sforzo congiunto di vari produttori per far fronte al problema: http://www.doxpara.com/?p=1162
Per i dettagli tecnici, vedere l'articolo su CERT: http://www.kb.cert.org/vuls/id/800113
Sempre nell'articolo del CERT è presente la lista dei sistemi coinvolti. Praticamente tutti, in varie forme:Microsoft, Cisco, Sun, Debian, RedHat, ecc. Altri sono ancora Unknown. Vedremo che cosa succederà nei prossimi giorni.
Molti dettagli tecnici sono presenti anche sul Advisory di Cisco: http://www.cisco.com/en/US/products/products_security_advisory09186a00809c2168.shtml
C'è però una cosa che non mi è ancora chiara: lo stato di Debian. Leggendo i vari avvisi presenti sul loro sito sembra che il problema su BIND sia stato risolto ma non quello "lato client". Vedi http://www.debian.org/security/2008/dsa-1605
Ad oggi, l'unico sistema ad ampia diffusione che sembra immune dal problema è Vista (almeno stando al bollettino di Microsoft).
UPDATE1: la cosa simpatica (si fa per dire) è che sembra che il problema fosse già stato evidenziato ben 3 anni addietro. Ecco il documento su SANS: http://www.sans.org/reading_room/whitepapers/dns/1567.php
Il documento è molto interessante perchè spiega nel dettaglio come avviene l'attaco. Si tratta di un classico attacco "Man in the middle". Come client viene usato Windows XP ma, come abbiamo visto in questi giorni, il problema è generalizzato.
UPDATE2: altro post molto interessante:
http://blog.netherlabs.nl/articles/2008/07/09/some-thoughts-on-the-recent-dns-vulnerability
Bert Hubert, l'autore, oltre a sostenere che il problema fosse noto dal 1999, fa anche alcune interessanti riflessioni sul DNS in se e su come certi enti non siano stati in gradi di reagire per tempo. Molto interessante.
giovedì, luglio 03, 2008
Sicurezza Home Banking
Mi stavo chiedendo perchè più di una banca online non "copra" tutto il sito, pagina del form di login compresa, con https. Cercando con Google sono capitato su un post del 2006 di Raffaele Rialdi. Sono passati gli anni e nulla è cambiato.
Ma le strutture tecniche che si occupano di web in queste banche, fanno finta di niente oppure non capiscono neanche quale sia il problema?
La cosa è ancora più buffa (per non dire altro) se confrontata con il decalogo dell'ABI (Associazione Bancaria Italiana). A pagina 6, al fondo, si legge:
Che dire? Speriamo che prima o poi certe banche decidano di leggere i decaloghi e i comunicati stampa della loro associazione, l'ABI.
Ma le strutture tecniche che si occupano di web in queste banche, fanno finta di niente oppure non capiscono neanche quale sia il problema?
La cosa è ancora più buffa (per non dire altro) se confrontata con il decalogo dell'ABI (Associazione Bancaria Italiana). A pagina 6, al fondo, si legge:
6. Quando inserite dati riservati in una pagina web, assicuratevi che si tratti di una pagina protetta: queste pagine sono riconoscibili in quanto l’indirizzo che compare nella barra degli indirizzi del browser comincia con “https://” e non con “http://” e nella parte in basso a destra della pagina è presente un lucchetto.Stesso concetto è ribadito sempre dall'ABI in un comunicato stampa del 6 agosto 2007:
Verifica l’autenticità della connessione con la tua banca, controllando con attenzione il nome del sito nella barra di navigazione. Se è presente, “clicca” due volte sull’icona del lucchetto (o della chiave) in basso a destra nella finestra di navigazione e verifica la correttezza dei dati che vengono visualizzati.
Che dire? Speriamo che prima o poi certe banche decidano di leggere i decaloghi e i comunicati stampa della loro associazione, l'ABI.
Firefox lento con Asp.net Development Server
A futura memoria!
Firefox è particolarmente lento quando lo si usa per navigare un sito in sviluppo sotto Visual Studio 2005.
Quest'ultimo utilizza un piccolo web server interno per mostrare il sito: Asp.net Development Server (webdev.webserver.exe). Personalmente ho riscontrato il problema con Vista Business.
Soluzione: modificae un parametro di configurazione di Firefox.
Firefox è particolarmente lento quando lo si usa per navigare un sito in sviluppo sotto Visual Studio 2005.
Quest'ultimo utilizza un piccolo web server interno per mostrare il sito: Asp.net Development Server (webdev.webserver.exe). Personalmente ho riscontrato il problema con Vista Business.
Soluzione: modificae un parametro di configurazione di Firefox.
- about:config
- impostare network.dns.disableIPv6 a true
mercoledì, luglio 02, 2008
Generics in C#: considerazioni dopo tre anni
Secondo me i Generics sono una delle feature più interessanti introdotte in NET 2.0. Ormai sono quasi tre anni che li uso e mi rendo conto che semplificano enormemente la vita. Poter controllore già a compile-time la correttezza dei tipi fa risparmiare molto tempo e mal di testa.
Il primo uso è sicuramente nelle "liste" & affini: poter lavorare con List<MiaClasse> invece che con ArrayList è tutta un'altra vita. Discorso analogo con Dictionary<A, B>, ecc.
Ci sono poi i delegate e metodi generics. Ad esempio: Comparison<T> , EventHandler<T> , ecc. E Comparer<T> nei metodi.
Per chi vuole approfondire il discorso sui generics facendo una comparazione anche con Java e C++ consiglio di leggere:
Il primo uso è sicuramente nelle "liste" & affini: poter lavorare con List<MiaClasse> invece che con ArrayList è tutta un'altra vita. Discorso analogo con Dictionary<A, B>, ecc.
Ci sono poi i delegate e metodi generics. Ad esempio: Comparison<T> , EventHandler<T> , ecc. E Comparer<T> nei metodi.
Per chi vuole approfondire il discorso sui generics facendo una comparazione anche con Java e C++ consiglio di leggere:
venerdì, giugno 20, 2008
Firebug e Firecookie
Un paio di tool molto utili per lo sviluppo web: FireBug e FireCookie.
Il primo è un plugin per Firefox che permette di vedere il codice javascript e scovare bug ed errori (oltre ad altre cose interessanti). Il secondo, FireCookie, è un plugin per FireBug che permette di vedere e modificare i cookie impostati durante la navigazione di un sito.
Entrambo molto utili.
Il primo è un plugin per Firefox che permette di vedere il codice javascript e scovare bug ed errori (oltre ad altre cose interessanti). Il secondo, FireCookie, è un plugin per FireBug che permette di vedere e modificare i cookie impostati durante la navigazione di un sito.
Entrambo molto utili.
venerdì, giugno 13, 2008
Use an internal class from another assembly
In big projects many classes has marked as internal. Tipically they are classes for internal activities and nobody needs to reference them from outside the assemply.
But, when you're developing you need to call them directly for testing/debugging. But... you cannot do that. The classes are internal.
There is a solution: mark the assembly as "friend" of another. An example: 2 assembly. MyLib with namy internal classes. DevTestApp, the test/development application with reference to MyLib. In the MyLib source code add:
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("DevTestApp")]
Now, from DevTestApp you can use public and internal classes from MyLib.
More details: http://msdn.microsoft.com/en-us/library/0tke9fxk(VS.80).aspx
But, when you're developing you need to call them directly for testing/debugging. But... you cannot do that. The classes are internal.
There is a solution: mark the assembly as "friend" of another. An example: 2 assembly. MyLib with namy internal classes. DevTestApp, the test/development application with reference to MyLib. In the MyLib source code add:
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("DevTestApp")]
Now, from DevTestApp you can use public and internal classes from MyLib.
More details: http://msdn.microsoft.com/en-us/library/0tke9fxk(VS.80).aspx
giovedì, maggio 29, 2008
Asp.net "full" compile from Visual Studio
Asp.net automatically compiles aspx pages. The code-behind is compiled in different ways dependingif you choose to work with "Asp.Net web application" project or with a "Asp.net web site".
When you work on an aspx in visual studio and you build the project/solution, VS compile the code-behind of the aspx page. But not the code in the aspx itself. The aspnet engine will compile the aspx page the first time it will be requested.
OK. Fantastic... but.... if you did an error, also a simple syntax error, you'll get evidence of it when you page will run. Not good. I'd like to do "full compile" to check all the code.
An example: this code does not work. But Vs2005 does not show any errors.
Another example: this code has a syntax error. Met2 is wrong. Met1 is the righe name. But again vs2005 does not show any errors.
The only solution I have found is to do a full compile using aspnet_compiler.exe after the build process of Visual Studio. Add the following command in the Post-build event of the project:
$(MSBuildBinPath)\aspnet_compiler.exe -p $(ProjectDir) -v /
Now, you are notified if there are errors in you aspx pages.
Obviously compilation requires more time!
When you work on an aspx in visual studio and you build the project/solution, VS compile the code-behind of the aspx page. But not the code in the aspx itself. The aspnet engine will compile the aspx page the first time it will be requested.
OK. Fantastic... but.... if you did an error, also a simple syntax error, you'll get evidence of it when you page will run. Not good. I'd like to do "full compile" to check all the code.
An example: this code does not work. But Vs2005 does not show any errors.
<script runat="server">
public static int Test()
{
public static int Test()
{
return "text";
}</script>
Another example: this code has a syntax error. Met2 is wrong. Met1 is the righe name. But again vs2005 does not show any errors.
<%=WebApplication1.Class1.Met2()%>
The only solution I have found is to do a full compile using aspnet_compiler.exe after the build process of Visual Studio. Add the following command in the Post-build event of the project:
$(MSBuildBinPath)\aspnet_compiler.exe -p $(ProjectDir) -v /
Now, you are notified if there are errors in you aspx pages.
Obviously compilation requires more time!
lunedì, maggio 19, 2008
Bug di sicurezza su Debian: la questione vera è un'altra
Sembra che nel lontano 2006, per la precisione il 2 maggio, gli sviluppatori di Debian abbiano messo una specie di "patch" ad OpenSSL distribuito con la loro versione di Linux. Il problema è che la "patch" in realtà non è una patch ma peggio ha introdotto un BUG:
http://www.debian.org/security/2008/dsa-1571
http://www.debian.org/security/2008/dsa-1576
Il bug è venuto fuori in questi giorni. Poco male si dirà. Certo, dopo poche ore c'era già la patch. Perfetto. Ma.... la patch risolve il bug e il funzionamento di openssl su Debian dal giorno in cui la si installa. Quindi tutti i certificati & affini creati con OpenSSL prima dell'applicazione della patch sono vulnerabili. Cioè quelli degli ultimi 2 anni. Vedi comunicato di Verisign: revocare i certificati e rigenerarli. Buon divertimento.
Ma la questione vera è un'altra. Non mi riferisco al fatto che tutti i sistemi operativi hanno dei bug. Questo è ovvio e sostenere il contrario è stupido. Non faccio paragoni fra Win e Linux e Mac e SunSolaris e chi volete voi: la scelta di un sistema operativo è o dovrebbe essere dettata da una serie di valutazone che comprendono ma che non si limitano al numero di bug e patch. Non voglio neanche entrare nella polemica del TCO (Total Cost of Ownership) fra Win e Linux.
Il punto vero su cui riflettere è che 2 righe di codice errato possono creare un casino enorme!
Quindi meglio pensarci 1000 volte prima di modificare codice funzionante soprattutto se scritto da altri.
http://www.debian.org/security/2008/dsa-1571
http://www.debian.org/security/2008/dsa-1576
Il bug è venuto fuori in questi giorni. Poco male si dirà. Certo, dopo poche ore c'era già la patch. Perfetto. Ma.... la patch risolve il bug e il funzionamento di openssl su Debian dal giorno in cui la si installa. Quindi tutti i certificati & affini creati con OpenSSL prima dell'applicazione della patch sono vulnerabili. Cioè quelli degli ultimi 2 anni. Vedi comunicato di Verisign: revocare i certificati e rigenerarli. Buon divertimento.
Ma la questione vera è un'altra. Non mi riferisco al fatto che tutti i sistemi operativi hanno dei bug. Questo è ovvio e sostenere il contrario è stupido. Non faccio paragoni fra Win e Linux e Mac e SunSolaris e chi volete voi: la scelta di un sistema operativo è o dovrebbe essere dettata da una serie di valutazone che comprendono ma che non si limitano al numero di bug e patch. Non voglio neanche entrare nella polemica del TCO (Total Cost of Ownership) fra Win e Linux.
Il punto vero su cui riflettere è che 2 righe di codice errato possono creare un casino enorme!
Quindi meglio pensarci 1000 volte prima di modificare codice funzionante soprattutto se scritto da altri.
venerdì, maggio 02, 2008
Sql HeartBeat
A very useful (and free!) product: Sql HeartBeat from SqlSolutions.
Very simple to use: select a sql server, connect to them and it shows info about:
A screenshot:
Very simple to use: select a sql server, connect to them and it shows info about:
- Waits
- Seek time
- Physical R/W
- Cache hits
- Process/Connection activity
A screenshot:
giovedì, aprile 17, 2008
Scaricare una GridView ed aprirla con Excel
Vabbè.... per chi non ha voglia di cercare con Google (come Andrea), ecco come salvare ed aprire con Excel una GridView da una pagina Asp.Net
Nella codice della pagina asp.net:
Per i dettagli su VerifyRenderingInServerForm vedere il sito MSDN. Comunque in 2 parole: molti (tutti?) dei controlli Asp.net devono essere creati al di sotto di <form runat="server">
Il metodo viene chiamato da questi controlli, tra cui GridView. L'implementazione standard di Page prevede che venga sollevata un eccezione se in quel momento la costruzione della pagina non è "al di sotto" di <form runat="server"> . Basta andare in override sul metodo e fargli fare una porcheria: saltare il controllo! Ovviamente è bene farlo solo quando serve: per questo c'è _bypassNormalVRISF.
Nella codice della pagina asp.net:
protected void Button_Click(object sender, ImageClickEventArgs e)
{
this.RenderToHtml(GVDetails, "foo.xls");
}
private void RenderToHtml(GridView gv, string fileName)
{
_bypassNormalVRISF = true; Response.Clear();
Response.ContentType = "application/vnd.ms-excel";
Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName);
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
gv.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();
}
private bool _bypassNormalVRISF = false;
public override void VerifyRenderingInServerForm(Control control)
{
if (_bypassNormalVRISF)
return;
else
base.VerifyRenderingInServerForm(control);
}
Per i dettagli su VerifyRenderingInServerForm vedere il sito MSDN. Comunque in 2 parole: molti (tutti?) dei controlli Asp.net devono essere creati al di sotto di <form runat="server">
Il metodo viene chiamato da questi controlli, tra cui GridView. L'implementazione standard di Page prevede che venga sollevata un eccezione se in quel momento la costruzione della pagina non è "al di sotto" di <form runat="server"> . Basta andare in override sul metodo e fargli fare una porcheria: saltare il controllo! Ovviamente è bene farlo solo quando serve: per questo c'è _bypassNormalVRISF.
venerdì, aprile 11, 2008
Italiani... non sono poi così male!
Ecco una notizia che mi fa veramente piacere: Jeff Atwood ha donato 5000 dollari al progetto ScrewTurn.
Jeff si era impegnato a donare 5000 dollari ad un progetto open source in tecnologia NET. La scelta è caduta su ScrewTurn, un motore wiki basato su asp.net.
Cosa c'entrano gli italiani? Semplice: ScrenTurn è coordinato da Dario Solera di Milano.
Complimenti Dario!
Jeff si era impegnato a donare 5000 dollari ad un progetto open source in tecnologia NET. La scelta è caduta su ScrewTurn, un motore wiki basato su asp.net.
Cosa c'entrano gli italiani? Semplice: ScrenTurn è coordinato da Dario Solera di Milano.
Complimenti Dario!
Esempi di sviluppo insicuro
Ecco alcuni link dal blog di Raffaele Rialdi che illustrano come NON sviluppare applicazioni web:
Il primo è pazzesco: web.config leggibile, db pubblico, sa come utente del db, administrator per la web application. Una summa delle peggiori cose che si possono fare in una web application. E sono riusciti pure a bypassare la sicurezza di NET rendendo leggibile il web.config.
Il secondo, invece, è un po' più subdolo ed ha a che fare più con aspetti di "politica della sicurezza" che con questioni strettamente tecniche.
Entrambbi da leggere assolutamente, commenti compresi!
Il primo è pazzesco: web.config leggibile, db pubblico, sa come utente del db, administrator per la web application. Una summa delle peggiori cose che si possono fare in una web application. E sono riusciti pure a bypassare la sicurezza di NET rendendo leggibile il web.config.
Il secondo, invece, è un po' più subdolo ed ha a che fare più con aspetti di "politica della sicurezza" che con questioni strettamente tecniche.
Entrambbi da leggere assolutamente, commenti compresi!
martedì, aprile 08, 2008
IIS6 StackOverFlow
Sometimes you need to run code with extensive use of stack due to recursive algorithms. But recursion (if very deep) can be very harmful for stack. I encountered such situation, in a particular use of iTextSharp. In my case, IIS 6 (w3wp.exe) crashed with an unknow exception that seemed to be thrown from kernel32.
I spent many hours trying to understand where the problem was. Using WinDbg and AdPlus I understood that the problem came from Net managed code, and after dumping the stack, it was clear which was the method(s).
First: it's not a library bug. If I reduce the work-load (number of input pdf files) it works perfectly. Second: the same piece of code, with the same input pdf files, runs perfectly from a command-line application. So, the problem is related to the IIS "environment".
Solution: increase the stack! Ok, but how ? Simple: running the code inside a thread with a bigger stack!
On IIS6 the "default" threads are created with 256 KB of stack. I haven't found a way to change it. But, from your asp.net code you can create and run a new thread with a bigger stack.
Example code (direct run):
protected void Button1_Click(object sender, EventArgs e)
{
this.Run();
}
private void Run()
{
//... code with or calling library with high use of stack
}
Passing trought a "working" thread (with 1 MB of stack):
protected void Button1_Click(object sender, EventArgs e)
{
this.RunAsSeparatedThread();
}
private void RunAsSeparatedThread()
{
Thread t = new Thread(Run, 1 * 1024 * 1024);
t.IsBackground = true;
t.Start();
t.Join();
}
private void Run()
{
//... code with or calling library with high use of stack
}
I spent many hours trying to understand where the problem was. Using WinDbg and AdPlus I understood that the problem came from Net managed code, and after dumping the stack, it was clear which was the method(s).
First: it's not a library bug. If I reduce the work-load (number of input pdf files) it works perfectly. Second: the same piece of code, with the same input pdf files, runs perfectly from a command-line application. So, the problem is related to the IIS "environment".
Solution: increase the stack! Ok, but how ? Simple: running the code inside a thread with a bigger stack!
On IIS6 the "default" threads are created with 256 KB of stack. I haven't found a way to change it. But, from your asp.net code you can create and run a new thread with a bigger stack.
Example code (direct run):
protected void Button1_Click(object sender, EventArgs e)
{
this.Run();
}
private void Run()
{
//... code with or calling library with high use of stack
}
Passing trought a "working" thread (with 1 MB of stack):
protected void Button1_Click(object sender, EventArgs e)
{
this.RunAsSeparatedThread();
}
private void RunAsSeparatedThread()
{
Thread t = new Thread(Run, 1 * 1024 * 1024);
t.IsBackground = true;
t.Start();
t.Join();
}
private void Run()
{
//... code with or calling library with high use of stack
}
domenica, aprile 06, 2008
Inkscape
Some days ago I was looking for a free drawing tool. But not a raster (bitmap) editor. I need a vector editor (like Illustrator or Freehand).
After googling for a while, I found Inkscape www.inkscape.org . It's an opensource vector graphics editor. It's based on SVG standard (W3C standard). Simple but very powerful.
After googling for a while, I found Inkscape www.inkscape.org . It's an opensource vector graphics editor. It's based on SVG standard (W3C standard). Simple but very powerful.
Subversion: primi test con Visual Studio 2005
Primi test con SubVersion e Visual Studio 2005. Risultato: funziona... ma che bel casino!
Al momento sto valutando 2 approcci diversi per l'integrazione frs SVN e VS2005:
Inoltre TortoiseSVN ha strumenti molto più sofisticati per la gestione dei conflitti. Ovviamente si possono usare entrambi: Ankhsvn per le attività "normali", TortoiseSvn per quelle speciali e sofisticate.
Dopo vari casini sono riuscito a mettere su anche Apache con il ModSvn e ad attivare l'Https. A dire la verità i grossi casini sono più nel creare un certificato di prova https per Apache che impostare subversion.
[Update 16/04/2008]
Primi test seri di sviluppo multi-utente: qui cominciano i veri problemi!
Il grosso problema è la fase di merge: è abbastanza comune che 2 sviluppatori abbiano bisogno di mettere mano agli stessi file di codice sorgente. Ad esempio il primo modifica un metodo e il secondo ne aggiunge uno nuovo. Fin qui non ci sono grossi problemi: il più delle volte Ankhsvn è in grado di fare il merge in automatico. In altri casi invece, non riesce a risolvere i conflitti è l'unica è risolverli "a mano" con TortoiseMerge: per ogni riga e/o blocco in conflitto bisogna decidere chi vince oppure se farli vincere entrambi. Se i 2 sviluppatori di prima aggiungono entrambi un nuovo metodo nella stessa zona di codice, si crea un conflitto.
In questo caso è probabile che la soluzione sia di farli convivere entrambi nella file finale.
Ma i veri casini arrivano quando si iniziano ad usare elementi gestiti in modo più o meno automatico da VS2005. Un esempio per tutti: i Typed DataSet. Personalmente li uso molto e come purtroppo immaginavo creano grossi problemi a Subversion. O meglio: subversion crea grossi problemi ai typed dataset. Il problema come al solito è il merge. C'è un dataset che ha già una datatable, 2 utenti lo modificano, ad esempio aggiungendo una datatable a testa. Ovviamente c'è un problema di merge. Ma il typed dataset è più complesso di un semplice file .cs. In gioco ci sono 4 file:
Ma... non è finita. Provo a muovere una tabella e mi becco un bel errore da VS2005.
Dopo vari tentativi, ho cancellato il file .xss e Designer.cs. A questo punto VS li crea nuovamente e tutto sembra tornare a funzionare.
Conclusione (per ora): continuo a fare prove ma non porto nulla in produzione. Subversion e compagni mi convincono ogni giorno sempre di meno.
Al momento sto valutando 2 approcci diversi per l'integrazione frs SVN e VS2005:
- a livello di file system con TortoiseSVN
- direttamente in VS2005 con AnkhSVN
Inoltre TortoiseSVN ha strumenti molto più sofisticati per la gestione dei conflitti. Ovviamente si possono usare entrambi: Ankhsvn per le attività "normali", TortoiseSvn per quelle speciali e sofisticate.
Dopo vari casini sono riuscito a mettere su anche Apache con il ModSvn e ad attivare l'Https. A dire la verità i grossi casini sono più nel creare un certificato di prova https per Apache che impostare subversion.
[Update 16/04/2008]
Primi test seri di sviluppo multi-utente: qui cominciano i veri problemi!
Il grosso problema è la fase di merge: è abbastanza comune che 2 sviluppatori abbiano bisogno di mettere mano agli stessi file di codice sorgente. Ad esempio il primo modifica un metodo e il secondo ne aggiunge uno nuovo. Fin qui non ci sono grossi problemi: il più delle volte Ankhsvn è in grado di fare il merge in automatico. In altri casi invece, non riesce a risolvere i conflitti è l'unica è risolverli "a mano" con TortoiseMerge: per ogni riga e/o blocco in conflitto bisogna decidere chi vince oppure se farli vincere entrambi. Se i 2 sviluppatori di prima aggiungono entrambi un nuovo metodo nella stessa zona di codice, si crea un conflitto.
In questo caso è probabile che la soluzione sia di farli convivere entrambi nella file finale.
Ma i veri casini arrivano quando si iniziano ad usare elementi gestiti in modo più o meno automatico da VS2005. Un esempio per tutti: i Typed DataSet. Personalmente li uso molto e come purtroppo immaginavo creano grossi problemi a Subversion. O meglio: subversion crea grossi problemi ai typed dataset. Il problema come al solito è il merge. C'è un dataset che ha già una datatable, 2 utenti lo modificano, ad esempio aggiungendo una datatable a testa. Ovviamente c'è un problema di merge. Ma il typed dataset è più complesso di un semplice file .cs. In gioco ci sono 4 file:
- MyDS.xsd : dataset vero e proprio (xml)
- MyDS.Deseigner.cs : file di codice autogenerato da VS2005
- MyDS.xsc : autogenerato da vs2005
- MyDS.xss : autogenerato da vs2005. Contiente le informazioni per la rappresentazione a video degli elementi (coordinate xy, larghezza, ecc.)
Ma... non è finita. Provo a muovere una tabella e mi becco un bel errore da VS2005.
Dopo vari tentativi, ho cancellato il file .xss e Designer.cs. A questo punto VS li crea nuovamente e tutto sembra tornare a funzionare.
Conclusione (per ora): continuo a fare prove ma non porto nulla in produzione. Subversion e compagni mi convincono ogni giorno sempre di meno.
martedì, aprile 01, 2008
lunedì, marzo 03, 2008
Ghostscript without dependencies
Ghostscript is one of the most powerful Postscript/Pdf engine I have ever used. It can convert Ps to Pdf, Pdf to Ps, rasterize Pdf and Ps to Jpeg, Tiff, Bmp and so on.
But Ghostscript requires many files to run. When you install it, they are placed in the lib and resource folders (plus some fonts placed in the font folder). During the installation process, some entries are also placed in the registry (on Windows systems).
So, if you need to run Ghostscript on a machine, you need to install it.
There is a way to include all the needed file into the ghostscript dll: compile it using the option COMPILE_INITS=1. The resulting dll is bigger than the normal: 8.7 MB instead of 3.5 MB. It contains all the needed files. To run ghostsfcript you need only gswin32c.exe and gsdll32.dll.
I have compiled ghostscript 8.62 using Visual Studio 2005.
Donwload the source code from SourceForge and from the VS2005 command line, run:
nmake -f src\msvc32.mak DEVSTUDIO= COMPILE_INITS=1 MSVC_VERSION=8 GS_LIB_DEFAULT = "./lib/;./font;$(GSROOTDIR)/lib;$(AROOTDIR)/fonts"
UPDATE: AFAIK Ghostscript is compiled with COMPILE_INITS=1 starting from version 8.63. So, you don't need to compile it by yourself.
.
But Ghostscript requires many files to run. When you install it, they are placed in the lib and resource folders (plus some fonts placed in the font folder). During the installation process, some entries are also placed in the registry (on Windows systems).
So, if you need to run Ghostscript on a machine, you need to install it.
There is a way to include all the needed file into the ghostscript dll: compile it using the option COMPILE_INITS=1. The resulting dll is bigger than the normal: 8.7 MB instead of 3.5 MB. It contains all the needed files. To run ghostsfcript you need only gswin32c.exe and gsdll32.dll.
I have compiled ghostscript 8.62 using Visual Studio 2005.
Donwload the source code from SourceForge and from the VS2005 command line, run:
nmake -f src\msvc32.mak DEVSTUDIO= COMPILE_INITS=1 MSVC_VERSION=8 GS_LIB_DEFAULT = "./lib/;./font;$(GSROOTDIR)/lib;$(AROOTDIR)/fonts"
UPDATE: AFAIK Ghostscript is compiled with COMPILE_INITS=1 starting from version 8.63. So, you don't need to compile it by yourself.
.
venerdì, febbraio 08, 2008
Il mito degli "anni di esperienza"
Ieri è uscito un bel articolo sul blog di Jeff Atwood: The Years of Experience Myth (in inglese).
In sostanza Jeff mette in discussione uno degli elementi base usati da molte società di informatica o di recruitment durante la selezione del personale: gli "anni di esperienza".
Non posso che essere d'accordo con lui. Sostiene le stesse cose che mi è capitato più volte di dire: gli anni di esperienza non hanno alcun valore in quanto tali. Quello che conta realmente è la capacità di imparare, di aggiornarsi, di affrontare e di risolvere i problemi.
Ma, attenzione, tutto questo non vale solo nel campo dell'ICT. Anche quando facevo i corsi in Croce Rossa il messaggio che davo era sempre lo stesso: non basta essere "vecchi", cioè con molti anni di esperienza sulla strada, per essere dei buoni soccorritori. Ho conosciuto ottimi soccorritori usciti da pochi mesi dai corsi e pessimi soccorritori con molti anni di attività sulle spalle.
Tornando al settore ICT, sapere ad esempio che tizio ha lavorato 5 anni su Java non vuol dire niente. Bisogna invece capire che cosa ha fatto, come lo ha fatto, da dove è partito e dove è arrivato. 5 anni passati a fare manutenzione ad un'applicazione java che fa query su DB e che crea semplici tabelle html è quanto meno poco interessante. Meglio una persona che lavora da 1 solo anno su java ma che ha affrontato problemi ben più complessi.
Non voglio dire che l'esperienza non conti nulla, anzi. Sono il primo a sostenere che affrontare problemi reali in ambito lavorativo sia importantissimo. Ma la qualità del lavoro e dell'esperienza non si basa sul tempo "passato" ma dal come si è lavorato: curiosità, volontà di migliorarsi e di imparare cose nuove.
In sostanza Jeff mette in discussione uno degli elementi base usati da molte società di informatica o di recruitment durante la selezione del personale: gli "anni di esperienza".
Non posso che essere d'accordo con lui. Sostiene le stesse cose che mi è capitato più volte di dire: gli anni di esperienza non hanno alcun valore in quanto tali. Quello che conta realmente è la capacità di imparare, di aggiornarsi, di affrontare e di risolvere i problemi.
Ma, attenzione, tutto questo non vale solo nel campo dell'ICT. Anche quando facevo i corsi in Croce Rossa il messaggio che davo era sempre lo stesso: non basta essere "vecchi", cioè con molti anni di esperienza sulla strada, per essere dei buoni soccorritori. Ho conosciuto ottimi soccorritori usciti da pochi mesi dai corsi e pessimi soccorritori con molti anni di attività sulle spalle.
Tornando al settore ICT, sapere ad esempio che tizio ha lavorato 5 anni su Java non vuol dire niente. Bisogna invece capire che cosa ha fatto, come lo ha fatto, da dove è partito e dove è arrivato. 5 anni passati a fare manutenzione ad un'applicazione java che fa query su DB e che crea semplici tabelle html è quanto meno poco interessante. Meglio una persona che lavora da 1 solo anno su java ma che ha affrontato problemi ben più complessi.
Non voglio dire che l'esperienza non conti nulla, anzi. Sono il primo a sostenere che affrontare problemi reali in ambito lavorativo sia importantissimo. Ma la qualità del lavoro e dell'esperienza non si basa sul tempo "passato" ma dal come si è lavorato: curiosità, volontà di migliorarsi e di imparare cose nuove.
martedì, gennaio 29, 2008
Convert int[] to string[]
It's very common to need to convert an array of type T1 to an array of type T2.
Net 2.0 offers an interesting static member of the Array class: ConvertAll.
Using anonymous methods (MSDN) in conjunction with ConvertAll, you can convert an array of "simple" type to an array of another "simple" type in only ONE line of code.
An example: int[] to string[]
or (smaller):
You can also convert string[] to int[]:
If you need to convert between more complex type, probably you need more code in the delegate body. But the idea is the same: use a delegate as a converter between 2 types.
Net 2.0 offers an interesting static member of the Array class: ConvertAll
Using anonymous methods (MSDN) in conjunction with ConvertAll, you can convert an array of "simple" type to an array of another "simple" type in only ONE line of code.
An example: int[] to string[]
int[] inInt = new int[] { 47, 46, 45, 101 };
string[] outStr = Array.ConvertAll<int, string>(inInt, new Converter<int, string>(delegate(int x) { return x.ToString(); }));
or (smaller):
string[] outStr = Array.ConvertAll<int, string>(inInt, delegate(int x) { return x.ToString(); });
You can also convert string[] to int[]:
int[] outInt2 = Array.ConvertAll<string, int>(outStr, delegate(string s) { return int.Parse(s); });
If you need to convert between more complex type, probably you need more code in the delegate body. But the idea is the same: use a delegate as a converter between 2 types.
domenica, gennaio 27, 2008
Sviluppo "parallelo"
Ormai sono anni che i processori sono a tutti gli effetti dei "multi"processori. Si era iniziato con l'HyperThreding, poi i Dual Core, poi i QuadCore ed avanti così. Ma per gli sviluppatori la domanda è: ma ve ne fate realmente qualcosa di questi oggetti che sono in grado di eseguire più istruzioni in parallelo? Per molti la risposta è: NO! Ed il motivo è molto semplice: le applicazioni Console e Windows Form che sviluppano sono intrinsecamente mono-processo, o meglio mono-thread. Discorso a parte ovviamente per le applicazioni web tipo asp.net: questo effettivamente è un mondo effettivamente multi-thread.
Lo sviluppo parallelo non sempre è applicabile. Anzi sovente la logica è instrinsecamente lineare e non ci sono spazi per parallelizzarla. In altri casi invece questo è possibile. Ma qui iniziano i dolori. Senza un adeguato supporto fornito dal linguaggio/framework è molto oneroso (e tedioso) gestire i vari thread paralleli. Ed è forse per questo che, a meno di situazioni particolari in cui le performance sono fondamentali, si rinuncia allo sviluppo "parallelo" e si rimane sul tranquillo "seriale".
Come ho detto in precedenza, l'hardware è ormai molto avanti. Il software (sviluppo e framework) è ancora un po' indietro. Ma le cose stanno cambiando: un segno è l'uscita come Community Tecnology Preview di Parallel Extensions to .NET. Questa libreria fornisce una serie di estensioni a NET 3.5 per supportare in modo nativo una serie di costutti paralleli. Vedi articolo su MSDN Magazine.
Lo sviluppo parallelo non sempre è applicabile. Anzi sovente la logica è instrinsecamente lineare e non ci sono spazi per parallelizzarla. In altri casi invece questo è possibile. Ma qui iniziano i dolori. Senza un adeguato supporto fornito dal linguaggio/framework è molto oneroso (e tedioso) gestire i vari thread paralleli. Ed è forse per questo che, a meno di situazioni particolari in cui le performance sono fondamentali, si rinuncia allo sviluppo "parallelo" e si rimane sul tranquillo "seriale".
Come ho detto in precedenza, l'hardware è ormai molto avanti. Il software (sviluppo e framework) è ancora un po' indietro. Ma le cose stanno cambiando: un segno è l'uscita come Community Tecnology Preview di Parallel Extensions to .NET. Questa libreria fornisce una serie di estensioni a NET 3.5 per supportare in modo nativo una serie di costutti paralleli. Vedi articolo su MSDN Magazine.
martedì, gennaio 08, 2008
Typed dataset: consigli e tips
L'utilizzo dei typed dataset in Visual Studio 2005 semplifica e velocizza molto la scrittura di codice per l'accesso ai dati, quello che comunemente viene chiamato DAL (Data Access Layer). Ma i problemi sono dietro l'angolo....
Vedi: http://docs.google.com/Doc?id=dchmct9k_152cj9qfgdm
Come al solito, i commenti sono i benvenuti.
Vedi: http://docs.google.com/Doc?id=dchmct9k_152cj9qfgdm
Come al solito, i commenti sono i benvenuti.
domenica, gennaio 06, 2008
compilation debug="true"
In web.config, tra le altre cose, c'è la modalità di compilazione. Durante lo sviluppo dovrebbe essere impostata a true: <compilation debug="true" /> Ma quando si porta l'applicazione in produzione, è importante ricordarsi di impostarla a false.
Questo per una lunga serie di motivi:
Per maggiori info (in inglese):
Questo per una lunga serie di motivi:
- timeout: con true le pagine asp.net non vanno mai in timeout. Ottimo per il debug, disastroso in produzione.
- compilazione batch: compilazioni più lenta con true.
- ottimizzazione del codice: se true, non c'è ottimizzazione del codice. Performance peggiori.
- utilizzo memoria: maggiore utilizzo di memoria con true
- ... altri motivi
Per maggiori info (in inglese):
Fiddler and Visual Studio 2005
There are some problem using Fiddler with Visual Studio 2005 Development Server (Cassini). In particular if you're using IE7 and Vista.
On many blogs there are many workarounds and tips. The only that works with me is to add a new entry in the HOSTS file (C:\Windows\System32\drivers\etc). In my case, I added:
127.0.0.1 myself
Now, the url in Ie7 will be http://myself:51784/page.aspx. It works both with and without Fiddler runnig.
On many blogs there are many workarounds and tips. The only that works with me is to add a new entry in the HOSTS file (C:\Windows\System32\drivers\etc). In my case, I added:
127.0.0.1 myself
Now, the url in Ie7 will be http://myself:51784/page.aspx. It works both with and without Fiddler runnig.
mercoledì, gennaio 02, 2008
GridView, UpdatePanel e doppi click
Su vari post ho letto di persone che hanno problemi con GridView contenute in UpdatePanel Ajax.
Anche io ho trovato vari problemi. Il più strano è la necessità di premere 2 volte i linkbutton perchè questi facciano il loro lavoro. In realtà il postback avviene 2 volte ma la prima volta sembra andare perduto. La seconda volta funziona.
Facendo un po' di ricerche e di debug sembra che il primo post venga gestito come un"postback ajax" (passatemi questo termine) mentre il secondo è un trattato come un vero postback.
La soluzione che ho trovato è quello di registrare la GridView nella collezione dei Trigger del UpdatePanel che la contiene. Il trigger deve essere un PostBack e non un AsyncPostBack. In questo modo LinkButton tornano a funzionare al primo colpo.
Anche la documentazione ufficiale relativa a PostBackTrigger sembra confermare questo uso. Non capisco però perchè funzioni con click in sequenza. Boh...
Probabilemente i problemi sono dovuti anche alla struttura abbastanza annidata dei componenti della mia pagina asp.net. In successione i "contenitori" sono:
- master page
- content page
- multiview
- view
- updatepanel
- gridview
- linkbutton (o imagebutton)
Sinceramente non ho fatto prove con una struttura più semplice. Appena trovo 10 minuti...
Anche io ho trovato vari problemi. Il più strano è la necessità di premere 2 volte i linkbutton perchè questi facciano il loro lavoro. In realtà il postback avviene 2 volte ma la prima volta sembra andare perduto. La seconda volta funziona.
Facendo un po' di ricerche e di debug sembra che il primo post venga gestito come un"postback ajax" (passatemi questo termine) mentre il secondo è un trattato come un vero postback.
La soluzione che ho trovato è quello di registrare la GridView nella collezione dei Trigger del UpdatePanel che la contiene. Il trigger deve essere un PostBack e non un AsyncPostBack. In questo modo LinkButton tornano a funzionare al primo colpo.
<asp:updatepanel id="updtPnl" runat="server" updatemode="Conditional">
<contenttemplate>
<asp:gridview id="GV1">
.....
<asp:gridview>
</contenttemplate>
<triggers>
<asp:PostBackTrigger ControlID="GV1" />
<triggers>
<asp:updatepanel>
Anche la documentazione ufficiale relativa a PostBackTrigger sembra confermare questo uso. Non capisco però perchè funzioni con click in sequenza. Boh...
Probabilemente i problemi sono dovuti anche alla struttura abbastanza annidata dei componenti della mia pagina asp.net. In successione i "contenitori" sono:
- master page
- content page
- multiview
- view
- updatepanel
- gridview
- linkbutton (o imagebutton)
Sinceramente non ho fatto prove con una struttura più semplice. Appena trovo 10 minuti...
Iscriviti a:
Post (Atom)