Há algum tempo eu falei aqui sobre controles Data Sources (ObjectDataSource, SqlDataSource, etc.). Esses controles possuem tipos de parametros pré-definidos, como é o caso do CookieParameter, ControlParameter, SessionParameter, etc..
Só que há situações em que precisamos customizar tais tipos de parametros, ou melhor, extrair a informação de um local em que os parametros pré-definidos não nos ajudam. Para este cenário, podemos criar um parametro customizado, herdando da classe base Parameter, como é mostrado abaixo:
public class UserNameParameter : Parameter
{
public UserNameParameter() { }
//outras implementações//membros
protected override object Evaluate(HttpContext context, Control control)
{
if (context == null || !context.User.Identity.IsAuthenticated)
return null;
return context.User.Identity.Name;
}
}
Com esse controle criado, podemos utilizá-lo no interior de um controle ObjectDataSource, como podemos visualizar no trecho de código abaixo:
<%@ Register TagPrefix=”ia” Assembly=”ClassLibrary1″ Namespace=”ClassLibrary1″ %>
<asp:ObjectDataSource ID=”ObjectDataSource1″ runat=”server”
SelectMethod=”RecuperarUsuarios” TypeName=”ColecaoDeUsuarios”>
<SelectParameters>
<ia:UserNameParameter Name=”nome” />
</SelectParameters>
</asp:ObjectDataSource>
//Classe ColecaoDeUsuarios:
public List<Usuario> RecuperarUsuarios(string nome) { }
É importante lembrar que o atributo Name é herdado da classe Parameter e voce deverá definí-lo com o nome do parametro especificado no método RecuperarUsuarios (método de Select). Para finalizar, voce não precisa se restringir as propriedades existentes na classe Parameter; voce pode estar criando as tuas próprias propriedades (se preocupando em guardar as informações no ViewState) e permitindo que o usuário (outro desenvolvedor) atributo valor para ela durante a configuração do controle Data Source.