Chiarezza su cursor per Cross-Browsing

Mi direte: perchè supporti ancora Internet Explorer 5.5? Vi rispondo: forse è meglio chiedere perchè lo sopporto?!

Avete presente il casino legato a cursor:pointer, cursor:hand?

Una veloce ricerca su internet per risolverlo:

http://www.quirksmode.org/css/cursor.html

http://www.learnwebdesignonline.com/css-tutorials/cursor-hand-pointer.htm

La soluzione giusta dovrebbe essere la prima: a voi la soluzione..io non ho + Internet Explorer 5.5.

PS - per chi lo dovesse avere: Aggiornati!


Technorati tags:

Per postare il codice sul blog

Per postare il codice sul blog utilizzate questo tool:

http://blogs.ugidotnet.org/matteomigliore/archive/2007/08/26/postare-codice-formattato-sul-blog.aspx

grazie del suggerimento.

Il problema dell'upload di files

Leggo spesso di gente che ha problemi con l'upload di file molto grandi. L'errore che si riscontra non è gestibile dall'applicativo. Molti sanno che è possibile aumentare la dimensione dei file in upload (che poi si tratta effettivamente della dimensione della richiesta http) ed eventuali timeout di sessione direttamente nel web.config.

Ma questo spesso non basta...

Tempo fa avevo trovato il modo di gestire il tutto da un articolo. Purtroppo non posso fornire riferimenti (l'autore è libero di chiedermi di togliere questo codice da questa pagina o darmi il link) ma proverò a ricostruire il contenuto. Si trattava di un HttpModule, ovvero di un qualcosa che si va a inserire nella pipeline della gestione della richiesta.

Web.Config (aggiungiamo l'httpModule e una sezione di configurazione)


<configuration xmlns="...">
<configsections>
<section type="MyNameSpace.MyClassHandler, MyAssembly" name="UploadModuleManagement"/>
</configsections>
<uploadmodulemanagement pages="pagine da dove si effettua l'upload separate da virgola con MyApp.MyPage.aspx" buffersize="16384"/>
...
<system.web>
<httpmodules><add type="MyNameSpace.MyClassHandler, Assembly" name="MyClassHandler"/></httpmodules>
...

Poi la classe

using System.Web;
using System;
using System.Reflection;
using System.Data;
using System.Configuration;
using System.Threading;
using System.Xml;
using System.IO;
namespace MyNameSpace
{
public sealed class MyClassHandler : IHttpModule, IConfigurationSectionHandler
{
private const string configSection = "UploadModuleManagement";
private const string bufferSizeKey = "bufferSize";
private const string pagesKey = "pages";
public void Dispose()
{}
public object Create(object parent, object configContext, XmlNode section)
{
if (section != null)
{
HttpContext.Current.Application[bufferSizeKey] = Int32.Parse(section.SelectSingleNode("@bufferSize").Value);
HttpContext.Current.Application[pagesKey] = section.SelectSingleNode("@pages").Value.Split(',');
}
else
{
HttpContext.Current.Application[bufferSizeKey] = 1024;
HttpContext.Current.Application[pagesKey] = new string[] { "" };
}
return null;
}
private bool IsUploadPages()
{
HttpApplication app = HttpContext.Current.ApplicationInstance;
string[] uploadPages = (string[])app.Application[pagesKey];
for (int i = 0; i < uploadPages.Length; i++)
{
if (uploadPages[i].ToLower() == app.Request.Path.Substring(1).ToLower())
return true;
}
return false;
}
public void Init(HttpApplication app)
{
System.Configuration.ConfigurationManager.GetSection(configSection);
app.BeginRequest += new EventHandler(context_BeginRequest);
}
private void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
IServiceProvider provider = (IServiceProvider)HttpContext.Current;
HttpWorkerRequest worker = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
int bufferSize = (int)app.Application[bufferSizeKey];
if (IsUploadPages())
{
if (app.Context.Request.ContentLength > 0)
{
MemoryStream mem = new MemoryStream(app.Context.Request.ContentLength);
byte[] data = worker.GetPreloadedEntityBody();
mem.Write(data, 0, data.Length);
int read = 0;
int counter = data.Length;
while (counter < app.Context.Request.ContentLength)
{
if (counter + bufferSize > app.Context.Request.ContentLength)
bufferSize = app.Context.Request.ContentLength - counter;
data = new byte[bufferSize];
read = worker.ReadEntityBody(data, bufferSize);
counter += read;
mem.Write(data, 0, bufferSize);
}
mem.Position = 0;
byte[] memData = new byte[mem.Length];
mem.Read(memData, 0, (int)mem.Length);
//finito di intercettare, rimanda tutti i dati al worker process
PushRequestToIIS(worker, memData);
}
}
}
private void PushRequestToIIS(HttpWorkerRequest request, byte[] textParts)
{
BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic;
Type type = request.GetType();
while ((type != null) && (type.FullName != "System.Web.Hosting.ISAPIWorkerRequest"))
type = type.BaseType;
if (type != null)
{
type.GetField("_contentAvailLength", bindingFlags).SetValue(request, textParts.Length);
type.GetField("_contentTotalLength", bindingFlags).SetValue(request, textParts.Length);
type.GetField("_preloadedContent", bindingFlags).SetValue(request, textParts);
type.GetField("_preloadedContentRead", bindingFlags).SetValue(request, true);
}
}
}
}
Technorati tags:

GridView - Sorting

Il potentissimo controllo di Microsoft ha qualche difettuccio sul sorting. Io in genere, utilizzo un DataTable come DataSource. Nella griglia è integrato un meccanismo di sorting interno che, a quanto pare, funziona solo quando è specificato il DataSourceID, cioè l'ID del controllo che fa da DataSource.

Che peccato! Ho visto con il Reflector che probabilmente si potrebbero sfruttare le proprietà SortExpression e SortDirection anche con un source di tipo datatable o dataset... Ho contattato Microsoft anche perchè dalla documentazione si capisce diversamente.


Technorati tags: