Bom, outro dia disse que também sabia escrever sobre .NET. Como o pessoal de tecnologia é cético e apesar dos artigos já escritos aqui, vou tentar me arriscar em mais para tirar a prova.
Se tem algo que gosto no WebForms, é a versatilidade. Montagem de páginas dinâmicas (entenda montar como adicionar controles na página em tempo de execução) foi algo com que sempre me dei bem. CMSs como DotNetNuke e Umbraco são exemplos dessa “dinamicidade”. Quem vive disso sabe do que estou falando, das suas vantagens, e problemas.
Dentre eles, é que, como trabalhamos com controle dinâmicos, temos o cuidado de montar todos eles no evendo OnInit da página para manter o ViewState intacto. Até aqui, sem segredos. O problema é quando precisamos aplicar alguma regra de negócio na montagem dos controles que dependa por exemplo, de um valor num TextBox. Isso é um problema porque no OnInit, o ViewState ainda não foi aplicado.
Bom, a informação está lá no ViewState, mas como chegar até ela? Na necessidade, vasculhando o próprio ViewState e com a ajuda deste “How To” da Microsoft, cheguei num método que recebe como parâmetro o UniqueID do controle e o HttpRequest, você consegue chegar no valor antes antes do Page_Load.
public static string getControlValueByRequest(string UniqueID, HttpRequest request)
{
System.Collections.Specialized.NameValueCollection postedValues = request.Form;
String nextKey;
String value = string.Empty;
for (int i = 0; i < postedValues.AllKeys.Length; i++)
{
nextKey = postedValues.AllKeys[i];
if (nextKey.Substring(0, 2) != "__")
{
if (nextKey == UniqueID)
{
value = postedValues[i];
}
}
}
return value;
} |
public static string getControlValueByRequest(string UniqueID, HttpRequest request)
{
System.Collections.Specialized.NameValueCollection postedValues = request.Form;
String nextKey;
String value = string.Empty;
for (int i = 0; i < postedValues.AllKeys.Length; i++)
{
nextKey = postedValues.AllKeys[i];
if (nextKey.Substring(0, 2) != "__")
{
if (nextKey == UniqueID)
{
value = postedValues[i];
}
}
}
return value;
}
Aos mais entendidos, sabemos que a informação pode ser recuperada pelo Request.Form, mas o vínculo do valor com o controle de origem da informação que é o complicado, e é onde o método acima faz o trabalho sujo de passar por todo o conjunto de chaves/valor guardado no Request.Form e aplicando uma “regrinha” (atenção ao if (nextKey.Substring(0, 2) != “__”)) para chegar no valor desejado.
Isto posto, mais um helper para seus projetos WebForms, pelo menos para que ainda os cria. 🙂
Bom proveito!
How To da Microsoft
http://msdn.microsoft.com/en-us/library/6c3yckfw.aspx