Blog de Francisco Velázquez

otro blog personal

Posts Tagged ‘querystring

QueryString Helper

leave a comment »

Muy a menudo tengo que consultar los valores de las QueryStrings, y la verdad es que es horrible el montón de comprobaciones que hay que hacer. Además muchas veces, wap proxies o adsevers incluyen caracteres en la querystring, haciendo que los parsers lancen excepciones.

public static class Extensions
{
private static readonly Regex LeadingInteger = new Regex(@"^(-?\d+)");

public static T Get<T>(this System.Collections.Specialized.NameValueCollection nvc, string key)
where T : IConvertible
{
T obj = default(T);

if (nvc == null || string.IsNullOrEmpty(nvc[key]))
return default(T);

string v = nvc[key];

if (typeof(T) == typeof(Guid))
v = v.Substring(0, 36);

if (typeof(T) == typeof(int))
{   //http://stackoverflow.com/a/975512/22055
Match match = LeadingInteger.Match(v);
if (!match.Success)
v = match.Value;
else
return default(T);
}

try
{
obj = (T)Convert.ChangeType(v, typeof(T));
}
catch { }
return obj;
}
}

A veces, echo de menos las facilidades de lenguajes dinámicos como JS, por ejemplo, en el parseInt

Written by fravelgue

May 24, 2012 at 6:41 pm

Posted in development

Tagged with , ,

Modificar el valor de Request.Param o QueryString

with one comment

Hace unos días necesité modificar el valor de Request.Param y de la QueryString en una página ASP.NET. Parece que no es algo común pero sin embargo, había gente que también había necesitado hacerlo.

La manera de hacerlo fue usando un HttpModule y usando un poco de Reflection. La verdad algo bastante sencillo de hacer y con un buen resultado.

    public class ChangeParamsModule : IHttpModule
    {
        public void Dispose()
        {
            throw new NotImplementedException();
        }

        public void Init(HttpApplication context)
        {
            context.BeginRequest += (sender, e) =>
            {
                HttpApplication httpContext = (HttpApplication)sender;
                // reflect to getting readonly property
                PropertyInfo isReadOnly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);

                // make collection editable
                isReadOnly.SetValue(httpContext.Request.QueryString, false, null);
                isReadOnly.SetValue(httpContext.Request.Params, false, null);

                httpContext.Request.QueryString.Set("nuevoParam", "nuevoValor");
                httpContext.Request.Params.Set("nuevoParm", "nuevoValor");

                // make collection readonly again
                isReadOnly.SetValue(httpContext.Request.QueryString, true, null);
                isReadOnly.SetValue(httpContext.Request.Params, true, null);
            };
        }
    }

Written by fravelgue

October 19, 2011 at 5:47 pm