Web – Obtendo o valor de uma QueryString com JavaScript

Mais uma tarefa comum em aplicações Web que acabamos por precisar fazer também no JavaScript.

Obter o valor de uma queryString é trivial em qualquer linguagem server side (ASP, ColdFusion, PHP, etc), mas no JavaScript, não.

Indo atrás de algumas funçôes (existem várias por aí), achei uma que atendeu muito bem:

function queryString(value) 
{
	path = window.location.search.substring(1);
	queryStringValues = path.split("&");
	for (i=0; i < queryStringValues.length; i++) 
	{
		queryStringValue = queryStringValues[i].split("=");
		if (queryStringValue[0] == value) 
		{
			return queryStringValue[1];
		}
	}
}
 
// exemplo de chamada
function getQueryStringTest()
{
	// obtém a queryString do email
	var email = queryString("email");
	if (email != null)
	{
		alert('Valor da queryString: ' + email);
	}
	else
	{
		alert('Ops! Não tem nada aqui');
	}
}

Junto segue uma função de teste para a chamada. Para ver funcionando, basta acessar a página que contém o script no seu navegador com a queryString com o valor do email. Segue abaixo um exemplo funcional:

Sem queryString

http://www.tomasvasquez.com.br/downloads/queryStringTest.htm

Com queryString

http://www.tomasvasquez.com.br/downloads/queryStringTest.htm?email=webmaster@tomasvasquez.com.br

Referências

http://ilovethecode.com/Javascript/Javascript-Tutorials-How_To-Easy/Get_Query_String_Using_Javascript.shtml

C# – Obtendo os valores de todas as propriedades de um objeto

Tinha esquecido desse snippet. Com certeza ajuda, principalmente na depuração de aplicações.

Quando precisar saber os valores de todas as propriedades de um objeto, ao invés de sair destacando uma por uma, a rotina abaixo devolve os valores das propriedades de um determinado objeto, passado por parâmetro:

public static Dictionary<string, object> getPropertyValues(object o)
{
	Dictionary<string, object> propertyValues = new Dictionary<string, object>();
	Type ObjectType = o.GetType();
	System.Reflection.PropertyInfo[] properties = ObjectType.GetProperties();
	foreach (System.Reflection.PropertyInfo property in properties)
	{
		propertyValues.Add(property.Name, property.GetValue(o, null));
	}
	return propertyValues;
}

O código retorna um Dictionary, onde a string é o nome da propriedade e o object, seu valor. Inevitavelmente, é preciso o uso de Reflection para obter tais informações, o que provavelmente o leitor já esperava, certo? Daí para frente é só utilizar como bem entender.

Bom proveito.

C# – Referenciando tipos anônimos em controles DataBind

Novas funcionalidades são sempre bem vindas, mas as novidades sempre trazem mais novidades, situações, problemas, enfim, o trivial.

Os tipos anônimos do C# 3.0 economizam um bocado de tempo quando se precisa extrair algo de uma lista baseada em uma query LINQ. Vou dar um exemplo para elucidar a situação. Quando você extrai de uma determinada lista apenas alguns campos, por exemplo, do objeto:

public class Pessoa
{
	public string Nome { get; set; }
	public string SobreNome{ get; set; }
	public string Curso { get; set; }
	public string Escola { get; set; }
}

E queremos tirar uma lista única de Curso/Escola. Fácil, é só usar o Distinct, gerando algo como:

(from p in PessoaList
select new { p.Curso, p.Escola }).Distinct();

Mais fácil ainda se atribuir o resultado do código acima direto ao DataSource de um Repeater ou GridView. Mas, como fazer para coletar os valores e fazer o bind e um tipo que não existe, por exemplo, no evento ItemDataBound ou RowDataBound? Se você ativar o Watcher sobre o e.Item.DataItem, você verá um tipo anônimo referenciado de uma forma um pouco estranho. Se tentar usar no código, não funciona.

Como resolver? Não tem jeito: Reflection!

Se você tiver certeza de que a propriedade existe, dá para fazer uma referência direta:

e.Item.GetType().GetProperty("Escola").GetValue(e.Item, null)

Se houver dúvida quanto a existência, algumas verificações precisarão ser feitas. Deixo abaixo do código do colega leppie do StackOverFlow que faz tais verificações:

object o = e.Row.DataItem;
Type t = o.GetType();
PropertyInfo pi = t.GetProperty("StringProperty");
if (pi != null && pi.PropertyType == typeof(string))
{
  // the property exists!
  string s = pi.GetValue(o, null) as string;
  // we have the value
  // insert your code here
  // PROFIT!  :)
}

Bom proveito!

Referências:

http://stackoverflow.com/questions/607433/net-databinding-referencing-anonymous-type-properties