Hoje voltei a tentar efectuar a personalização da criação do objecto (definido pela propriedade DataObjectTypeName). Até à versão CTP de Dezembro era impossível procedermos a esta personalização. Contudo, parece que a Microsoft cumpriu o que havia prometido e a partir de agora já podemos personalizar a criação de componentes deste tipo. Para tal, temos de garantir o seguinte:
- não podemos definir a propriedade DataObjectTypeName (se utilizarmos esta propriedade, o controlo irá tentar sempre instanciar um elemento do tipo da classe indicada na propriedade);
- processar o evento XXXing (por exemplo, se necessitarmos de criar o objecto personalizado durante a actualização de dados devemos processar o evento OnUpdating);
- durante este evento devemos remover todos os parâmetros da colecção InputArguments e adicionar um novo com o objecto criado para esse efeito. Para que tudo funcione, é importante adicionarmos o parâmetro com o mesmo nome do parâmetro utilizado no método.
O código seguinte demonstra os passos necessários:
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<script runat="server">
void ProcessUpdated( object source, ObjectDataSourceStatusEventArgs args )
{
if(args.Exception != null)
{
info.Text = args.Exception.ToString( );
args.ExceptionHandled = true;
return;
}
if(Convert.ToBoolean( args.ReturnValue ))
info.Text = "Actualização efectuada com sucesso";
else
info.Text = "Ocorreu um erro durante a actualização! Por favor, volte a tentar";
}
void ProcessUpdating( object sender, ObjectDataSourceMethodEventArgs args )
{
string cnnString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + HttpContext.Current.Server.MapPath("~/app_Data/Test.mdb");
BetterImplementation.AlunosCollectionDB db = new BetterImplementation.AlunosCollectionDB(cnnString);
ImproperImplementation.Alunos aluno = db.LoadAlunoFromDb( (int)frm.DataKey.Value);
aluno.Morada = args.InputParameters["Morada"].ToString();
aluno.Nome = args.InputParameters["Nome"].ToString();
args.InputParameters.Clear( );
args.InputParameters.Add("alun", aluno);
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<h3>Actualização de dados com ObjectDataSource sem construtor público
(DataObjectTypeName)</h3>
<form id="form1" runat="server">
<asp:FormView runat="server" ID="frm" DefaultMode="Edit" DataKeyNames="IdAlunos"
DataSourceID="source">
<EditItemTemplate>
Nome Aluno: <asp:TextBox runat="server" ID="nome" Text='<%# Bind("Nome") %>' /><br />
Morada: <asp:TextBox runat="server" ID="Morada" Text='<%# Bind("Morada") %>'/><p></p>
<asp:Button ID="udpate" CommandName="Update" runat="server" Text="Actualizar" BorderColor="Black"
BorderStyle="solid" BorderWidth="1px" />
</EditItemTemplate>
</asp:FormView>
<asp:ObjectDataSource runat="server" ID="source" typename="ImproperImplementation.AlunosCollectionDB"
SelectMethod="LoadAlunoFromDb" UpdateMethod="UpdateDb"
OnUpdated="ProcessUpdated" OnUpdating="ProcessUpdating">
<SelectParameters>
<asp:Parameter Name="id" DefaultValue="1" Type="int32" />
</SelectParameters>
</asp:ObjectDataSource>
<asp:Label runat="server" ID="info" />
</form>
</body>
</html>
posted on Sunday, March 20, 2005 10:38 PM