Compatiblità di explorer con asp.net – hotfix problemi di visualizzazione

Non è una novità che Microsoft rilasci nuovi prodotti che finiscono per avere problemi di compatibilità con la tecnologia che Microsoft stessa promuove.  Uno di questi casi è il borwser Explorer in particolare la versione 10 che accedendo a siti sviluppati con asp.net, framework per web application promosso da Microsft,  presenta problemi di visualizzazione e interazione.  Può sembrare paradossale ma il problema affligge anche le web application di Microsoft come Sharepoint (SharePoint 2007, SharePoint 2010 and IE10 compatibility – Oliver Wirkus – SharePointCommunity ). Va evidenziato poi  che mentre Explorer presenta problmei di compatibilità  Chrome, Firefox e Safari interagiscono correttamente.

Quindi, come tradizione in queste situazioni,  Microsoft è costretta a rilasciare hotfix per risolvere il problema.  Nel caso specifico è possibile utilizare lo hotfix A hotfix is available for the ASP.NET browser definition files in the .NET Framework 2.0 SP2 and in the .NET Framework 3.5 SP1 che consente di aggiornare il i files con le definizioni dei browsers presenti in .NET Framework 2.0 SP2 e ..NET Framework 3.5 SP1. E’ necessario scaricare o farsi inviare via email come indicato in http://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=2600100&kbln=en-us  lo hotfix specifico per il proprio  sistemi operativo.  Nel caso di Windows Server 2008 R2 64 bit, il file scaricato, decompresso,  è di tipo .msu. Windows6.1-KB2600100-x64.msu si installa automaticamente ma richiede il riavvio del sistema.

Hotfix Kb2600100

Hotfix Kb2600100

 

Hotfix Kb2600100 update

Hotfix Kb2600100 update

 

Hotfix Kb2600100 restart

Hotfix Kb2600100 restart

 

 

Annunci

Confronto tra i metodi: ExecuteNonQuery, ExecuteReader, ExecuteScalar

I metodi ExecuteNonQuery, ExecuteReader, ExecuteScalar sono i tre principali metodi della classe SqlCommand.Gli oggetti risultanti, una volta instanziata la classe, consentono l’esecuzioni di istruzioni SQL e Stored Procedure in un Database di un Server SQL.

Il metodo ExecuteNonQuery viene usato per eseguire una instruzione SQL e stored procedure di tipo INSERT, DELETE e UPDATE. In questo caso il valore ritornato è il numero di record che sono stati interessati dal comando SQL. Più in generale viene usato per le action queries quindi oltre che per le istruzioni SQL UPDATE, INSERT, DELETE anche per le istruzioni CREATE, ATER, DROP.  Il valore ritornato ( result type ) è di tipo int. Se l’istruzioni SQL coinvolge records il result è il numero degli stessi diversamente è -1. Esempio in  asp.net c#   database postgresql con provider dati Npgsql

...
dbcon = new NpgsqlConnection(NpgsqlConnectionString);
dbcon.Open();
NpgsqlCommand command = new NpgsqlCommand( "DELETE FROM products WHERE itemid = 56", dbcon);
int result reader = command.ExecuteNonQuery();
...

Il metodo ExecuteReader ritorna una collezione di righe e colonne ( records ) e viene pertanto utilizzato per le istruzioni di tipo SELECT. Più in generale ExecuteReader lavora sia con query di tipo SELECT ( Non-Action ) che con le query di tipo Action. Il tipo ritornato essendo una collezione di records sara di tipo DataReader. Esempio in  asp.net c#   database postgresql con provider dati Npgsql

...
dbcon = new NpgsqlConnection(NpgsqlConnectionString);
dbcon.Open();
NpgsqlCommand command = new NpgsqlCommand( "SELECT * FROM products", dbcon);
IDataReader reader = command.ExecuteReader();
...

Il metodo ExecuteScalar ritorna la prima colonna della prima riga della query che viene  lanciata in esecuzione. Le rimanenti righe e colonne sono ignorate. Comodo nel caso di query di tipo Count.  Più in generale vien usato per le query di tipo Non Action con funzioni di aggregazione. Viene ritornato un valore di tipo object.

...
dbcon = new NpgsqlConnection(NpgsqlConnectionString);
dbcon.Open();
NpgsqlCommand command = new NpgsqlCommand( "SELECT COUNT(itemid) AS "Num.", productline FROM products GROUP BY productline", dbcon);
object result = command.ExecuteScalar();
...

Risorse:

System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client

ASP.NET con il framework 4.0 aumenta i controlli legati alla di sicurezza. Quindi è abbastanza facile aggiornando un sito dalla versione 2.0/3.5 incorrere nell’errore :

System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client

Soprattutto quando si editano form dedicati l’aggiornamento dei contenuti. La soluzione più immediata per superare l’errore è data dall’utilizzo della modalità di validazione di ASP.NET 2.0.

In questo caso nel file web.config

<system.web>
 <httpRuntime requestValidationMode="2.0"/>
 ....
 </ system.web>

Se si è in ASP.NET 4.5 e si richiede il rendering secondo quest’ultima versione la riga potrebbe essere del tipo

<system.web>
    <httpRuntime requestValidationMode="2.0" targetFramework="4.5" />
....
</ system.web>

E’ possibile anche disabilitare globalmente la validazione. La scelta non risulta consigliabile considerato che in ASP.NET la “request validation” conferisce comunque un certo livello di sicurezza contro gli attacchi cross-site scripting ( XSS ).

La disabilitazione globale si effettua disabilitando sempre in <system.web> la Request Validation  per le pagine con

<system.web>
 <pages validateRequest="false" />
  ...
</system.web>

 

Risorse

Asp.net differenze tra IDataReader, NpgsqlDataAdapter, DataSet e DataTable

DataReader e DataAdapter sono oggetti presenti in tutti i provider dati .NET Framework è hanno la funzione di consentire il recupero dei dati da un database o comunque da un origine dati. I provider dei dati .NET framework  sono componenti espressamente progettati  che consentono la connessione ad un database, l’esecuzione di comandi e il recupero dei dati. Rappresentano uno dei principali componenti di ADO.NET (attualmente – ver.3.0) la cui funzione è consentire uniformita nell’accesso ai dati sia per origini dati presentate via ODBC e OLE DB sia per origini quali database SQL Server ( MS SQL Server, Oracle, Postgresql …) e XML.

L’oggetto DataReader consente di recuperare i dati in sola lettura ( forward-only ) da un database.
Il DataAdapter consente il recupero dei dati e la compilazione degli stessi all’interno di un oggetto DataSet o DataTable.

Il provider di dati .Net framework per SQL Server mette a disposizione  SqlDataReader e SqlDataAdapter. Analogamente in quello per ODBC avremo OdbcDataReader e OdbcDataAdapater. In quello per OLE DB troveremo OledbDataReader e OledbDataAdapter. Per ulteriore dettagli  Provider di dati .NET Framework Nel caso di PostreSQL uno dei provider dati .NET più utilizzati è Npgsql. Scritto in c# mette a disposizioni IDataReader e NpgsqlDataAdapter.

L’altro componente principale di ADO.NET oltre al provider dei dati .NET è   DataSet. Semplificando si tratta di una cache di dati cioè DataSet è una rappresentazione di dati presente in memoria composta da una collezione di tabelle con le relazioni tra le stesse. Trattandosi di una rappresentazione coerente indipendente dall’origini dati stessa non è necessaria una connessione attiva con l’origine dati per la manipolazione dei dati. La connessione e richiesta solo per l’update dei records nel database.

Di seguito un confronto sintetico tra  IDataReader, NpgsqlDataAdapter, DataTable, DataSet per la connessione a database Postgresql utilizzando Nplgsql

DataReader

IDataReader essendo un DataReader consente la sola lettura dei dati. .  E’ più performante di DataSet. Generalemente può essere iterato una sola volta ( Il cursore si muove in una sola direzione )Per associare i dati di una tabella postgresql ad una GridView utilizzando IDataReader si utilizza il codice seguente:

NpgsqlConnection conn = new NpgsqlConnection("Server=10.0.1.150, Port=5432;Database=myDB;Users ID=ospite;Password=abcd1234;Encoding=unicode;Pooling=falseConnectionLifeTime=10");
conn.Open();
NpgsqlCommand cmd = new NpgsqlCommand("Select ....", conn); 
IDataReader dr = cmd.ExecuteReader();
GridView1.DataSource = dr; 
GridView1.DataBind(); 
conn.Close();

DataAdapter

IDataAdapter come DataAdapter consente il recupero dei dati e la compilazione associandoli all’oggetto DataSet. In pratica un ponte tra database e DataSet. DataAdapter poichè consente una rappresentazione coerente dei dati in memoria è anche indicato come “disconnected oriented architecture”. Per associare i dati da un database postgresql ad una GridView utilizzando un DataAdapter è necessario ricorrere anche ad un DataSet (o una Datatable). Il codice sarà il seguente:

... 
conn.Open();
NpgsqlCommand cmd = new NpgsqlCommand("Select ....", conn); 
NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds) ; 
GridView1.DataSource = ds; 
GridView1.DataBind(); 
conn.Close();

DataSet

DataSet è una rappresentazione di dati presente in memoria composta da una collezione di DataTables con le relazione tra le tabelle. Una volta caricati i dati la connessione al database può essere chiusa anche automaticamente. I DataSet per agire sui dati non necessitano di una connessione attiva con l’origine dati trattandosi di una rappresentazione dei dati coerente indipendente dall’origine dati stessa.
E’ possibile selezionare dati da tabelle, creare viste e richiamare child rows basate su relazioni. DataSet offre funzionalità avanzate quali il salvataggio dei dati in XML e il caricamento di dati XML. DataSet necessita di un DataAdapter per la lettura dei dati dal database.  Il codice sarà inevitabilmente identico a quello indicato nel caso del NpgsqlDataAdapter:

...
conn.Open();
NpgsqlCommand cmd = new NpgsqlCommand("Select ....", conn); 
NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds) ; 
GridView1.DataSource = ds; 
GridView1.DataBind(); 
conn.Close();
 

DataTable

DataTable si comporta come DataSet con la differenza che rappresenta solo una singola tabella del database con righe (records/rows) e colonne ( columns/fields). Pertanto anche in questo caso non è necessaria una connessione attiva quando si opera su una DataTable ed è necessario un DataAdapter.

....
conn.Open();
NpgsqlCommand cmd = new NpgsqlCommand("Select ....", conn); 
NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt) ; 
GridView1.DataSource = da; 
GridView1.DataBind(); 
conn.Close();

Convertire un dataset in datareader

Per convertire un dataset in datareader è possibile utilizzare un istruzione del tipo seguente:

DataTableReader _dr = _ds.Tables[0].CreateDataReader();

Convertire un dataset in DataTable

Per convertire un dataset in datatable è possibile utilizzare un istruzione del tipo seguente:

DataTable _dt = _ds.Tables[0];
oppure
DataTable _dt = _ds.Tables["products"]

Risorse:

ASP.NET The variable ‘ex’ is declared but never used

Per evitare questo warning è sufficiente non indicare la variabili

...
...
     try
     {
          myConnection.Open();
          string _tmpquery = "SELECT * FROM tabs WHERE portalid = 0 AND LOWER(tabname) = 'home' ";
          NpgsqlCommand _Command = new NpgsqlCommand(_tmpquery, myConnection);
          dr = _Command.ExecuteReader();
          myConnection.Close();

     }
     catch (Exception ex)
     {
         Response.Redirect(Request.ApplicationPath + "/offline.aspx");               
     }

variabile ex non utilizzata

...
...
     try
     {
        ...
        ... 
     }
     catch (Exception)
     {
         Response.Redirect(Request.ApplicationPath + "/offline.aspx");               
     }

oppure si può utilizzare un modo neutro di utilizzo del eccezione

     }
     catch (Exception ex )
     {
         Response.Redirect(Request.ApplicationPath + "/offline.aspx");               
         message = "Exception message:" + ex ; 
     }

 

Volendo è possibile anche utilizzare pragma warning che consente di abilitare o disabilitare certi warning
#pragma warning (C# Reference)

#pragma warning disable 0168 // variable declared but not used.
#pragma warning disable 0219 // variable assigned but not used.
#pragma warning disable 0414 // private field assigned but not used.

...
...
     try
     {
        ...
        ... 
     }
     #pragma warning disable 0168
     catch (Exception)
     #pragma warning disable 0168
     { 
         Response.Redirect(Request.ApplicationPath + "/offline.aspx");

     }

 

Popup senza javascript con il css

Un  esempio di utilizzo del css per far apparire popup accanto al testo sfruttando i tag <a> e <span>.
Questo metodo, In asp.net, con l’elaborazione di <span sul lato server consente di ottenere box con contenuto dinamico articolati  come evidenziato in figura.

popup css  senza javascript

popup css senza javascript

La base del css popup consiste nel non rendere visibile al caricamento della pagina, il contenuto del tag  <span sfruttando la proprietà display:none.

Quindi quando il mouse passa sul link, selector/stato link:over, la proprietà display viene impostata in display:block cosicchè il contenuto del tag span viene reso visibie.

Affichè la posizione dell popup faccia riferimento alla posizione del link si utilizzano la proprietà position:relative per il link e position:absolute per lo stato a:hover span.

La proprietà z-index definisce il livello in cui si collocano gli elementi e può far comodo per gestire i rapporti di posizione avanti/dietro anche degli elementi contigui presenti nella pagina.

Esempio base

popup css simple

popup css simple

parte html

<div>
Questo è un esempio di popup senza javascript <a class=”popupcss” href=”#”>my blog  <span>E questo è il popup che appare</span></a>
</div>

le impostazioni css

<style type="text/css">
a.popupcss { position: relative!important; z-index:9}

a.popupcss:hover { z-index:10}

a.popupcss span { display:none!important}

a.popupcss:hover span { 
  display:block!important; position:absolute;
  bottom:1em; left:2em; min-width:10em; padding:2px; 
  border: 2px inset #797979; background-color:#f9f9f9 }
</style>

Sotto lo <span   con  runat=”server”  che in asp.net consente di eleborare  il controllo <span sul lato server e che è che è stato usato epr ritornare quanto presente nella figura in alto.

<div> Questo è un esempio di popup senza javascript  <a href=”#”>popup css <span id=”Modules” class=”Normal” runat=”server” /> </a>  </div>

pagina con le risorse dedicate al world wide web 

 

Asp.Net Compiler Error CS0433 The type exists in both … error

L’errore si verifica quando sono presenti in una stesso namespace due type con lo stesso nome o che creano ambiguità

Compilation Error

Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately.

Compiler Error Message: CS0433: The type ‘ASP.DLAPrdList’ exists in both ‘c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\download_en\4f25970d\2c8527e5\App_Web_g3eu1xej.dll’ and ‘c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\download_en\4f25970d\2c8527e5\App_Web_h4famu4b.dll’

Compiler Error CS0433 è possibile risolvere come indicato in

https://msdn.microsoft.com/en-us/library/64wh5743.aspx

Oppure conviene se possibile utilizzare nomi diversi per il type ad esempio  se in due  usercontrol  .ascx vengono utilizzati due reference control diversi usermod1.ascx

<%@ Reference Control="~/Controls/DLAPrdList.ascx" %>

usermod2.ascx

<%@ Reference Control="~/Controls/DLAFileList.ascx" %>

E in ciascuno di questi si crea uno UserControl a partire dal controllo referenziato con

DLAPrdList UC_DLAPrdList = new() DLAPrdList();
 UC_DLAPrdList.ID = "UC_DLAPrdList" + x.ToString();
 UC_DLAPrdList.LoadControl("~/Controls/DLAPrdList.ascx");
 MyDLAControl(UC_DLAPrdList, pid, _title, _pc, PH );

e

DLAFileList UC_DLAFileList = new() DLAFileList();
 UC_DLAFileList.ID = "UC_DLAFileList" + x.ToString();
 UC_DLAFileList.LoadControl("~/Controls/UC_DLAFileList.ascx");
MyDLAControl(UC_DLAFileList, pid, title, pc, PH );

Non conviene utilizzare un metodo _DLAControl con lo stesso nome

private void MyDLAControl(DLAPrdList MyDLAList, int _pid, string _Mytitle, int _Mypc, PlaceHolder MyPlaceHolder)
 {
   MyDLAList.myPar = _pid;
   MyDLAList.Mypc = _pc;
   MyDLAList.title = _title;
   MyDLAList.IsEditable = IsEditable;
   MyDLAList.ModuleId = ModuleId;
   MyDLAList.myConnection = myConnection;
   MyPlaceHolder.Controls.Add(_DLAList);
}

Nelle due fattipecie

private void MyDLAControl(DLAFileList MyDLAList, int _pid, string _Mytitle, int _pc, PlaceHolder MyPlaceHolder)
 {
   MyDLAList.myPar = _pid;
   MyDLAList.Mypc = _pc;
   MyDLAList.title = _title;
   MyDLAList.IsEditable = IsEditable;
   MyDLAList.ModuleId = ModuleId;
   MyDLAList.myConnection = myConnection;
   MyPlaceHolder.Controls.Add(_DLAList);
}

pena il verificarsi dell’errore CS0433 sopra menzioato: Compiler Error CS0433 Risorse: