473,386 Members | 1,752 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,386 software developers and data experts.

ObjectDataSource in ASP.NET 2.0

I'm having some trouble using the ObjectDataSource in ASP.NET 2.0.

I have a wrapper that contains the static methods for Select and Update. The
Update-method takes the business object as parameter.

When the Update-method is invoked by the ObjectDataSource, the object
referenced is not the same object returned by the Select-method, but a new
object with only the values from the Edit-template. So basically I get a
reference to a useless object here because it cannot be used by the DAL.

Is this a bug or a feature?

Here is some code to illustrate:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataSourceID="ObjectDataSource1">

<Columns>

<asp:CommandField ShowEditButton="True" />

<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />

</Columns>

</asp:GridView>

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
DataObjectTypeName="Customer"

SelectMethod="GetCustomers" TypeName="MyWrapperObj"
UpdateMethod="Save"></asp:ObjectDataSource>

And the C#-code:

public class Customer

{

private int id;

public int Id

{

get { return id; }

set { id = value; }

}

private string name;

public string Name

{

get { return name; }

set { name = value; }

}

public void Save()

{

// Do some things here...

}

}

public class MyWrapperObj

{

public static IList<Customer> GetCustomers()

{

List<Customer> customers = new List<Customer>();

for (int i = 0; i < 10; i++)

{

Customer customer = new Customer();

customer.Id = i;

customer.Name = string.Format("Name {0}", i);
customers.Add(customer);

}

return customers;

}

public static void Save(Customer obj)

{

obj.Save(); // This object is NOT in the IList returned by GetCustomers()

}

}
Nov 19 '05 #1
5 1959
Hi Ole M,

Welcome to ASPNET newsgroup.

Regarding on the ObjectDataSource's update method's question, I think it's
the normal behavior which is expected.
For datasourcecontrol and databindig control, after the object data source
pass the data bojects to data controls, it no longer hold the actual
refernce of the oringial data(nor does the data binding control), also
since the actual backend datasource may vary (maybe database or xml file or
....), it don't quite makesense to maintain such a in-memory reference. In
fact, this also somewhat related to the ASP.NET application's runtime
model, it's request/response based, generally after page output response to
client, all the serverside objects will be disposed and in-memory reference
will no longer make sense in the next page lifecycle. This is diferent
from winform application. So in such scenario, we should update the
original object through its primary key value or retrieve the reference
again from orginal datasource, e.g:
======================

private static List<Employee> _list;
.......

public static void UpdateEmployee(Employee emp)
{
EmployeePredicate ep = new EmployeePredicate(emp.ID);

Employee employee = _list.Find(ep.Assert);

if (employee == null)
{
throw new Exception("Invalid Employee info in
UpdateEmployee()...");
}

employee.Name = emp.Name;
employee.Email = emp.Email;
}

public class EmployeePredicate
{
private long _id;

public EmployeePredicate(long id)
{
_id = id;
}

public bool Assert(Employee emp)
{
if (emp.ID == _id)
{
return true;
}
else
{
return false;
}
}

}

============================

Thanks,

Steven Cheng
Microsoft Online Support

Get Secure! www.microsoft.com/security
(This posting is provided "AS IS", with no warranties, and confers no
rights.)


--------------------
| From: "Ole M" <ol**@community.nospam>
| Subject: ObjectDataSource in ASP.NET 2.0
| Date: Mon, 31 Oct 2005 22:03:59 +0100
| Lines: 113
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| X-RFC2646: Format=Flowed; Original
| Message-ID: <#a**************@TK2MSFTNGP10.phx.gbl>
| Newsgroups: microsoft.public.dotnet.framework.aspnet
| NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
| Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP10.phx.gbl
| Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.aspnet:135092
| X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
|
| I'm having some trouble using the ObjectDataSource in ASP.NET 2.0.
|
| I have a wrapper that contains the static methods for Select and Update.
The
| Update-method takes the business object as parameter.
|
| When the Update-method is invoked by the ObjectDataSource, the object
| referenced is not the same object returned by the Select-method, but a
new
| object with only the values from the Edit-template. So basically I get a
| reference to a useless object here because it cannot be used by the DAL.
|
| Is this a bug or a feature?
|
| Here is some code to illustrate:
|
| <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
| DataSourceID="ObjectDataSource1">
|
| <Columns>
|
| <asp:CommandField ShowEditButton="True" />
|
| <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name"
/>
|
| </Columns>
|
| </asp:GridView>
|
| <asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
| DataObjectTypeName="Customer"
|
| SelectMethod="GetCustomers" TypeName="MyWrapperObj"
| UpdateMethod="Save"></asp:ObjectDataSource>
|
| And the C#-code:
|
| public class Customer
|
| {
|
| private int id;
|
| public int Id
|
| {
|
| get { return id; }
|
| set { id = value; }
|
| }
|
| private string name;
|
| public string Name
|
| {
|
| get { return name; }
|
| set { name = value; }
|
| }
|
| public void Save()
|
| {
|
| // Do some things here...
|
| }
|
| }
|
| public class MyWrapperObj
|
| {
|
| public static IList<Customer> GetCustomers()
|
| {
|
| List<Customer> customers = new List<Customer>();
|
| for (int i = 0; i < 10; i++)
|
| {
|
| Customer customer = new Customer();
|
| customer.Id = i;
|
| customer.Name = string.Format("Name {0}", i);
|
|
| customers.Add(customer);
|
| }
|
| return customers;
|
| }
|
| public static void Save(Customer obj)
|
| {
|
| obj.Save(); // This object is NOT in the IList returned by GetCustomers()
|
| }
|
| }
|
|
|

Nov 19 '05 #2
Hi,

I see your point, but there is still a problem with the solution you have
there. The object passed to the Update(or in your case, UpdateEmployee)
method only contains values of the fields in the form. So, if the field "Id"
is not editable by the user, the value of "Id" is always 0.

"Steven Cheng[MSFT]" <st*****@online.microsoft.com> skrev i melding
news:Oc**************@TK2MSFTNGXA01.phx.gbl...
Hi Ole M,

Welcome to ASPNET newsgroup.

Regarding on the ObjectDataSource's update method's question, I think it's
the normal behavior which is expected.
For datasourcecontrol and databindig control, after the object data source
pass the data bojects to data controls, it no longer hold the actual
refernce of the oringial data(nor does the data binding control), also
since the actual backend datasource may vary (maybe database or xml file
or
...), it don't quite makesense to maintain such a in-memory reference. In
fact, this also somewhat related to the ASP.NET application's runtime
model, it's request/response based, generally after page output response
to
client, all the serverside objects will be disposed and in-memory
reference
will no longer make sense in the next page lifecycle. This is diferent
from winform application. So in such scenario, we should update the
original object through its primary key value or retrieve the reference
again from orginal datasource, e.g:
======================

private static List<Employee> _list;
......

public static void UpdateEmployee(Employee emp)
{
EmployeePredicate ep = new EmployeePredicate(emp.ID);

Employee employee = _list.Find(ep.Assert);

if (employee == null)
{
throw new Exception("Invalid Employee info in
UpdateEmployee()...");
}

employee.Name = emp.Name;
employee.Email = emp.Email;
}

public class EmployeePredicate
{
private long _id;

public EmployeePredicate(long id)
{
_id = id;
}

public bool Assert(Employee emp)
{
if (emp.ID == _id)
{
return true;
}
else
{
return false;
}
}

}

============================

Thanks,

Steven Cheng
Microsoft Online Support

Get Secure! www.microsoft.com/security
(This posting is provided "AS IS", with no warranties, and confers no
rights.)


--------------------
| From: "Ole M" <ol**@community.nospam>
| Subject: ObjectDataSource in ASP.NET 2.0
| Date: Mon, 31 Oct 2005 22:03:59 +0100
| Lines: 113
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| X-RFC2646: Format=Flowed; Original
| Message-ID: <#a**************@TK2MSFTNGP10.phx.gbl>
| Newsgroups: microsoft.public.dotnet.framework.aspnet
| NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
| Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP10.phx.gbl
| Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.aspnet:135092
| X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
|
| I'm having some trouble using the ObjectDataSource in ASP.NET 2.0.
|
| I have a wrapper that contains the static methods for Select and Update.
The
| Update-method takes the business object as parameter.
|
| When the Update-method is invoked by the ObjectDataSource, the object
| referenced is not the same object returned by the Select-method, but a
new
| object with only the values from the Edit-template. So basically I get a
| reference to a useless object here because it cannot be used by the DAL.
|
| Is this a bug or a feature?
|
| Here is some code to illustrate:
|
| <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
| DataSourceID="ObjectDataSource1">
|
| <Columns>
|
| <asp:CommandField ShowEditButton="True" />
|
| <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name"
/>
|
| </Columns>
|
| </asp:GridView>
|
| <asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
| DataObjectTypeName="Customer"
|
| SelectMethod="GetCustomers" TypeName="MyWrapperObj"
| UpdateMethod="Save"></asp:ObjectDataSource>
|
| And the C#-code:
|
| public class Customer
|
| {
|
| private int id;
|
| public int Id
|
| {
|
| get { return id; }
|
| set { id = value; }
|
| }
|
| private string name;
|
| public string Name
|
| {
|
| get { return name; }
|
| set { name = value; }
|
| }
|
| public void Save()
|
| {
|
| // Do some things here...
|
| }
|
| }
|
| public class MyWrapperObj
|
| {
|
| public static IList<Customer> GetCustomers()
|
| {
|
| List<Customer> customers = new List<Customer>();
|
| for (int i = 0; i < 10; i++)
|
| {
|
| Customer customer = new Customer();
|
| customer.Id = i;
|
| customer.Name = string.Format("Name {0}", i);
|
|
| customers.Add(customer);
|
| }
|
| return customers;
|
| }
|
| public static void Save(Customer obj)
|
| {
|
| obj.Save(); // This object is NOT in the IList returned by
GetCustomers()
|
| }
|
| }
|
|
|

Nov 19 '05 #3
Hi Ole M,

Thanks for your response. However, as for the further problem you
mentioned, I think we can still let the ID property being passed from
GridView's field to the DataSource for updating. The GridView can let us
specify "DataKeyNames" so as to indicate which field is the key column.
Also, for the fields, we can set the field's "readonly" and "Visible"
property so as to make the primary key field readonly or invisible. So
event we define the following gridView template schema:

==========
<asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource1"
AutoGenerateColumns="False" DataKeyNames="ID"
OnRowUpdating="GridView1_RowUpdating">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:BoundField DataField="ID" HeaderText="ID"
ReadOnly="true" Visible="false" />
<asp:BoundField DataField="Name"
..................

==========================

The "ID" field is set to invisible, the value will still be passed to the
update event of the GridView or DataSource control. We can check it in the
GridView's RowUpdating event like below:

======================
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs
e)
{
foreach (string key in e.Keys.Keys)
{
Response.Write("<br>key: " + e.Keys[key]);
}

foreach (string key in e.OldValues.Keys)
{
Response.Write("<br>Oldvalue: " + e.OldValues[key]);
}

foreach (string key in e.NewValues.Keys)
{
Response.Write("<br>Newvalue: " + e.NewValues[key]);
}

}
=======================

Thanks,

Steven Cheng
Microsoft Online Support

Get Secure! www.microsoft.com/security
(This posting is provided "AS IS", with no warranties, and confers no
rights.)
--------------------
| From: "Ole M" <ol**@community.nospam>
| References: <#a**************@TK2MSFTNGP10.phx.gbl>
<Oc**************@TK2MSFTNGXA01.phx.gbl>
| Subject: Re: ObjectDataSource in ASP.NET 2.0
| Date: Tue, 1 Nov 2005 14:53:16 +0100
| Lines: 229
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| X-RFC2646: Format=Flowed; Original
| Message-ID: <uy**************@TK2MSFTNGP12.phx.gbl>
| Newsgroups: microsoft.public.dotnet.framework.aspnet
| NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
| Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP12.phx.gbl
| Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.aspnet:135220
| X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
|
| Hi,
|
| I see your point, but there is still a problem with the solution you have
| there. The object passed to the Update(or in your case, UpdateEmployee)
| method only contains values of the fields in the form. So, if the field
"Id"
| is not editable by the user, the value of "Id" is always 0.
|
| "Steven Cheng[MSFT]" <st*****@online.microsoft.com> skrev i melding
| news:Oc**************@TK2MSFTNGXA01.phx.gbl...
| > Hi Ole M,
| >
| > Welcome to ASPNET newsgroup.
| >
| > Regarding on the ObjectDataSource's update method's question, I think
it's
| > the normal behavior which is expected.
| > For datasourcecontrol and databindig control, after the object data
source
| > pass the data bojects to data controls, it no longer hold the actual
| > refernce of the oringial data(nor does the data binding control), also
| > since the actual backend datasource may vary (maybe database or xml
file
| > or
| > ...), it don't quite makesense to maintain such a in-memory reference.
In
| > fact, this also somewhat related to the ASP.NET application's runtime
| > model, it's request/response based, generally after page output
response
| > to
| > client, all the serverside objects will be disposed and in-memory
| > reference
| > will no longer make sense in the next page lifecycle. This is diferent
| > from winform application. So in such scenario, we should update the
| > original object through its primary key value or retrieve the reference
| > again from orginal datasource, e.g:
| >
| >
| > ======================
| >
| > private static List<Employee> _list;
| > ......
| >
| > public static void UpdateEmployee(Employee emp)
| > {
| > EmployeePredicate ep = new EmployeePredicate(emp.ID);
| >
| > Employee employee = _list.Find(ep.Assert);
| >
| > if (employee == null)
| > {
| > throw new Exception("Invalid Employee info in
| > UpdateEmployee()...");
| > }
| >
| > employee.Name = emp.Name;
| > employee.Email = emp.Email;
| > }
| >
| > public class EmployeePredicate
| > {
| > private long _id;
| >
| > public EmployeePredicate(long id)
| > {
| > _id = id;
| > }
| >
| > public bool Assert(Employee emp)
| > {
| > if (emp.ID == _id)
| > {
| > return true;
| > }
| > else
| > {
| > return false;
| > }
| > }
| >
| > }
| >
| > ============================
| >
| > Thanks,
| >
| > Steven Cheng
| > Microsoft Online Support
| >
| > Get Secure! www.microsoft.com/security
| > (This posting is provided "AS IS", with no warranties, and confers no
| > rights.)
| >
| >
| >
| >
| > --------------------
| > | From: "Ole M" <ol**@community.nospam>
| > | Subject: ObjectDataSource in ASP.NET 2.0
| > | Date: Mon, 31 Oct 2005 22:03:59 +0100
| > | Lines: 113
| > | X-Priority: 3
| > | X-MSMail-Priority: Normal
| > | X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| > | X-RFC2646: Format=Flowed; Original
| > | Message-ID: <#a**************@TK2MSFTNGP10.phx.gbl>
| > | Newsgroups: microsoft.public.dotnet.framework.aspnet
| > | NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
| > | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP10.phx.gbl
| > | Xref: TK2MSFTNGXA01.phx.gbl
| > microsoft.public.dotnet.framework.aspnet:135092
| > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
| > |
| > | I'm having some trouble using the ObjectDataSource in ASP.NET 2.0.
| > |
| > | I have a wrapper that contains the static methods for Select and
Update.
| > The
| > | Update-method takes the business object as parameter.
| > |
| > | When the Update-method is invoked by the ObjectDataSource, the object
| > | referenced is not the same object returned by the Select-method, but a
| > new
| > | object with only the values from the Edit-template. So basically I
get a
| > | reference to a useless object here because it cannot be used by the
DAL.
| > |
| > | Is this a bug or a feature?
| > |
| > | Here is some code to illustrate:
| > |
| > | <asp:GridView ID="GridView1" runat="server"
AutoGenerateColumns="False"
| > | DataSourceID="ObjectDataSource1">
| > |
| > | <Columns>
| > |
| > | <asp:CommandField ShowEditButton="True" />
| > |
| > | <asp:BoundField DataField="Name" HeaderText="Name"
SortExpression="Name"
| > />
| > |
| > | </Columns>
| > |
| > | </asp:GridView>
| > |
| > | <asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
| > | DataObjectTypeName="Customer"
| > |
| > | SelectMethod="GetCustomers" TypeName="MyWrapperObj"
| > | UpdateMethod="Save"></asp:ObjectDataSource>
| > |
| > | And the C#-code:
| > |
| > | public class Customer
| > |
| > | {
| > |
| > | private int id;
| > |
| > | public int Id
| > |
| > | {
| > |
| > | get { return id; }
| > |
| > | set { id = value; }
| > |
| > | }
| > |
| > | private string name;
| > |
| > | public string Name
| > |
| > | {
| > |
| > | get { return name; }
| > |
| > | set { name = value; }
| > |
| > | }
| > |
| > | public void Save()
| > |
| > | {
| > |
| > | // Do some things here...
| > |
| > | }
| > |
| > | }
| > |
| > | public class MyWrapperObj
| > |
| > | {
| > |
| > | public static IList<Customer> GetCustomers()
| > |
| > | {
| > |
| > | List<Customer> customers = new List<Customer>();
| > |
| > | for (int i = 0; i < 10; i++)
| > |
| > | {
| > |
| > | Customer customer = new Customer();
| > |
| > | customer.Id = i;
| > |
| > | customer.Name = string.Format("Name {0}", i);
| > |
| > |
| > | customers.Add(customer);
| > |
| > | }
| > |
| > | return customers;
| > |
| > | }
| > |
| > | public static void Save(Customer obj)
| > |
| > | {
| > |
| > | obj.Save(); // This object is NOT in the IList returned by
| > GetCustomers()
| > |
| > | }
| > |
| > | }
| > |
| > |
| > |
| >
|
|
|

Nov 19 '05 #4
Hi,

Ah, great. I wasnt aware of the DataKeyNames property.

Thanks alot for the help!

"Steven Cheng[MSFT]" <st*****@online.microsoft.com> skrev i melding
news:TW**************@TK2MSFTNGXA01.phx.gbl...
Hi Ole M,

Thanks for your response. However, as for the further problem you
mentioned, I think we can still let the ID property being passed from
GridView's field to the DataSource for updating. The GridView can let us
specify "DataKeyNames" so as to indicate which field is the key column.
Also, for the fields, we can set the field's "readonly" and "Visible"
property so as to make the primary key field readonly or invisible. So
event we define the following gridView template schema:

==========
<asp:GridView ID="GridView1" runat="server"
DataSourceID="ObjectDataSource1"
AutoGenerateColumns="False" DataKeyNames="ID"
OnRowUpdating="GridView1_RowUpdating">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:BoundField DataField="ID" HeaderText="ID"
ReadOnly="true" Visible="false" />
<asp:BoundField DataField="Name"
.................

==========================

The "ID" field is set to invisible, the value will still be passed to the
update event of the GridView or DataSource control. We can check it in the
GridView's RowUpdating event like below:

======================
protected void GridView1_RowUpdating(object sender,
GridViewUpdateEventArgs
e)
{
foreach (string key in e.Keys.Keys)
{
Response.Write("<br>key: " + e.Keys[key]);
}

foreach (string key in e.OldValues.Keys)
{
Response.Write("<br>Oldvalue: " + e.OldValues[key]);
}

foreach (string key in e.NewValues.Keys)
{
Response.Write("<br>Newvalue: " + e.NewValues[key]);
}

}
=======================

Thanks,

Steven Cheng
Microsoft Online Support

Get Secure! www.microsoft.com/security
(This posting is provided "AS IS", with no warranties, and confers no
rights.)
--------------------
| From: "Ole M" <ol**@community.nospam>
| References: <#a**************@TK2MSFTNGP10.phx.gbl>
<Oc**************@TK2MSFTNGXA01.phx.gbl>
| Subject: Re: ObjectDataSource in ASP.NET 2.0
| Date: Tue, 1 Nov 2005 14:53:16 +0100
| Lines: 229
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| X-RFC2646: Format=Flowed; Original
| Message-ID: <uy**************@TK2MSFTNGP12.phx.gbl>
| Newsgroups: microsoft.public.dotnet.framework.aspnet
| NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
| Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP12.phx.gbl
| Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.aspnet:135220
| X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
|
| Hi,
|
| I see your point, but there is still a problem with the solution you
have
| there. The object passed to the Update(or in your case, UpdateEmployee)
| method only contains values of the fields in the form. So, if the field
"Id"
| is not editable by the user, the value of "Id" is always 0.
|
| "Steven Cheng[MSFT]" <st*****@online.microsoft.com> skrev i melding
| news:Oc**************@TK2MSFTNGXA01.phx.gbl...
| > Hi Ole M,
| >
| > Welcome to ASPNET newsgroup.
| >
| > Regarding on the ObjectDataSource's update method's question, I think
it's
| > the normal behavior which is expected.
| > For datasourcecontrol and databindig control, after the object data
source
| > pass the data bojects to data controls, it no longer hold the actual
| > refernce of the oringial data(nor does the data binding control), also
| > since the actual backend datasource may vary (maybe database or xml
file
| > or
| > ...), it don't quite makesense to maintain such a in-memory reference.
In
| > fact, this also somewhat related to the ASP.NET application's runtime
| > model, it's request/response based, generally after page output
response
| > to
| > client, all the serverside objects will be disposed and in-memory
| > reference
| > will no longer make sense in the next page lifecycle. This is
diferent
| > from winform application. So in such scenario, we should update the
| > original object through its primary key value or retrieve the
reference
| > again from orginal datasource, e.g:
| >
| >
| > ======================
| >
| > private static List<Employee> _list;
| > ......
| >
| > public static void UpdateEmployee(Employee emp)
| > {
| > EmployeePredicate ep = new EmployeePredicate(emp.ID);
| >
| > Employee employee = _list.Find(ep.Assert);
| >
| > if (employee == null)
| > {
| > throw new Exception("Invalid Employee info in
| > UpdateEmployee()...");
| > }
| >
| > employee.Name = emp.Name;
| > employee.Email = emp.Email;
| > }
| >
| > public class EmployeePredicate
| > {
| > private long _id;
| >
| > public EmployeePredicate(long id)
| > {
| > _id = id;
| > }
| >
| > public bool Assert(Employee emp)
| > {
| > if (emp.ID == _id)
| > {
| > return true;
| > }
| > else
| > {
| > return false;
| > }
| > }
| >
| > }
| >
| > ============================
| >
| > Thanks,
| >
| > Steven Cheng
| > Microsoft Online Support
| >
| > Get Secure! www.microsoft.com/security
| > (This posting is provided "AS IS", with no warranties, and confers no
| > rights.)
| >
| >
| >
| >
| > --------------------
| > | From: "Ole M" <ol**@community.nospam>
| > | Subject: ObjectDataSource in ASP.NET 2.0
| > | Date: Mon, 31 Oct 2005 22:03:59 +0100
| > | Lines: 113
| > | X-Priority: 3
| > | X-MSMail-Priority: Normal
| > | X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| > | X-RFC2646: Format=Flowed; Original
| > | Message-ID: <#a**************@TK2MSFTNGP10.phx.gbl>
| > | Newsgroups: microsoft.public.dotnet.framework.aspnet
| > | NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
| > | Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP10.phx.gbl
| > | Xref: TK2MSFTNGXA01.phx.gbl
| > microsoft.public.dotnet.framework.aspnet:135092
| > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
| > |
| > | I'm having some trouble using the ObjectDataSource in ASP.NET 2.0.
| > |
| > | I have a wrapper that contains the static methods for Select and
Update.
| > The
| > | Update-method takes the business object as parameter.
| > |
| > | When the Update-method is invoked by the ObjectDataSource, the
object
| > | referenced is not the same object returned by the Select-method, but
a
| > new
| > | object with only the values from the Edit-template. So basically I
get a
| > | reference to a useless object here because it cannot be used by the
DAL.
| > |
| > | Is this a bug or a feature?
| > |
| > | Here is some code to illustrate:
| > |
| > | <asp:GridView ID="GridView1" runat="server"
AutoGenerateColumns="False"
| > | DataSourceID="ObjectDataSource1">
| > |
| > | <Columns>
| > |
| > | <asp:CommandField ShowEditButton="True" />
| > |
| > | <asp:BoundField DataField="Name" HeaderText="Name"
SortExpression="Name"
| > />
| > |
| > | </Columns>
| > |
| > | </asp:GridView>
| > |
| > | <asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
| > | DataObjectTypeName="Customer"
| > |
| > | SelectMethod="GetCustomers" TypeName="MyWrapperObj"
| > | UpdateMethod="Save"></asp:ObjectDataSource>
| > |
| > | And the C#-code:
| > |
| > | public class Customer
| > |
| > | {
| > |
| > | private int id;
| > |
| > | public int Id
| > |
| > | {
| > |
| > | get { return id; }
| > |
| > | set { id = value; }
| > |
| > | }
| > |
| > | private string name;
| > |
| > | public string Name
| > |
| > | {
| > |
| > | get { return name; }
| > |
| > | set { name = value; }
| > |
| > | }
| > |
| > | public void Save()
| > |
| > | {
| > |
| > | // Do some things here...
| > |
| > | }
| > |
| > | }
| > |
| > | public class MyWrapperObj
| > |
| > | {
| > |
| > | public static IList<Customer> GetCustomers()
| > |
| > | {
| > |
| > | List<Customer> customers = new List<Customer>();
| > |
| > | for (int i = 0; i < 10; i++)
| > |
| > | {
| > |
| > | Customer customer = new Customer();
| > |
| > | customer.Id = i;
| > |
| > | customer.Name = string.Format("Name {0}", i);
| > |
| > |
| > | customers.Add(customer);
| > |
| > | }
| > |
| > | return customers;
| > |
| > | }
| > |
| > | public static void Save(Customer obj)
| > |
| > | {
| > |
| > | obj.Save(); // This object is NOT in the IList returned by
| > GetCustomers()
| > |
| > | }
| > |
| > | }
| > |
| > |
| > |
| >
|
|
|

Nov 19 '05 #5
You're welcome Ole M,

Have a good day!

Steven Cheng
Microsoft Online Support

Get Secure! www.microsoft.com/security
(This posting is provided "AS IS", with no warranties, and confers no
rights.)
--------------------
| From: "Ole M" <ol**@community.nospam>
| References: <#a**************@TK2MSFTNGP10.phx.gbl>
<Oc**************@TK2MSFTNGXA01.phx.gbl>
<uy**************@TK2MSFTNGP12.phx.gbl>
<TW**************@TK2MSFTNGXA01.phx.gbl>
| Subject: Re: ObjectDataSource in ASP.NET 2.0
| Date: Wed, 2 Nov 2005 11:51:05 +0100
| Lines: 339
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| X-RFC2646: Format=Flowed; Original
| Message-ID: <#N**************@tk2msftngp13.phx.gbl>
| Newsgroups: microsoft.public.dotnet.framework.aspnet
| NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
| Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!tk2msft ngp13.phx.gbl
| Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.aspnet:135459
| X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
|
| Hi,
|
| Ah, great. I wasnt aware of the DataKeyNames property.
|
| Thanks alot for the help!
|
| "Steven Cheng[MSFT]" <st*****@online.microsoft.com> skrev i melding
| news:TW**************@TK2MSFTNGXA01.phx.gbl...
| > Hi Ole M,
| >
| > Thanks for your response. However, as for the further problem you
| > mentioned, I think we can still let the ID property being passed from
| > GridView's field to the DataSource for updating. The GridView can let us
| > specify "DataKeyNames" so as to indicate which field is the key column.
| > Also, for the fields, we can set the field's "readonly" and "Visible"
| > property so as to make the primary key field readonly or invisible. So
| > event we define the following gridView template schema:
| >
| > ==========
| > <asp:GridView ID="GridView1" runat="server"
| > DataSourceID="ObjectDataSource1"
| > AutoGenerateColumns="False" DataKeyNames="ID"
| > OnRowUpdating="GridView1_RowUpdating">
| > <Columns>
| > <asp:CommandField ShowEditButton="True" />
| > <asp:BoundField DataField="ID" HeaderText="ID"
| > ReadOnly="true" Visible="false" />
| > <asp:BoundField DataField="Name"
| > .................
| >
| > ==========================
| >
| > The "ID" field is set to invisible, the value will still be passed to
the
| > update event of the GridView or DataSource control. We can check it in
the
| > GridView's RowUpdating event like below:
| >
| > ======================
| > protected void GridView1_RowUpdating(object sender,
| > GridViewUpdateEventArgs
| > e)
| > {
| > foreach (string key in e.Keys.Keys)
| > {
| > Response.Write("<br>key: " + e.Keys[key]);
| > }
| >
| > foreach (string key in e.OldValues.Keys)
| > {
| > Response.Write("<br>Oldvalue: " + e.OldValues[key]);
| > }
| >
| > foreach (string key in e.NewValues.Keys)
| > {
| > Response.Write("<br>Newvalue: " + e.NewValues[key]);
| > }
| >
| > }
| > =======================
| >
| > Thanks,
| >
| > Steven Cheng
| > Microsoft Online Support
| >
| > Get Secure! www.microsoft.com/security
| > (This posting is provided "AS IS", with no warranties, and confers no
| > rights.)
| >
| >
| > --------------------
| > | From: "Ole M" <ol**@community.nospam>
| > | References: <#a**************@TK2MSFTNGP10.phx.gbl>
| > <Oc**************@TK2MSFTNGXA01.phx.gbl>
| > | Subject: Re: ObjectDataSource in ASP.NET 2.0
| > | Date: Tue, 1 Nov 2005 14:53:16 +0100
| > | Lines: 229
| > | X-Priority: 3
| > | X-MSMail-Priority: Normal
| > | X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| > | X-RFC2646: Format=Flowed; Original
| > | Message-ID: <uy**************@TK2MSFTNGP12.phx.gbl>
| > | Newsgroups: microsoft.public.dotnet.framework.aspnet
| > | NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
| > | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP12.phx.gbl
| > | Xref: TK2MSFTNGXA01.phx.gbl
| > microsoft.public.dotnet.framework.aspnet:135220
| > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
| > |
| > | Hi,
| > |
| > | I see your point, but there is still a problem with the solution you
| > have
| > | there. The object passed to the Update(or in your case,
UpdateEmployee)
| > | method only contains values of the fields in the form. So, if the
field
| > "Id"
| > | is not editable by the user, the value of "Id" is always 0.
| > |
| > | "Steven Cheng[MSFT]" <st*****@online.microsoft.com> skrev i melding
| > | news:Oc**************@TK2MSFTNGXA01.phx.gbl...
| > | > Hi Ole M,
| > | >
| > | > Welcome to ASPNET newsgroup.
| > | >
| > | > Regarding on the ObjectDataSource's update method's question, I
think
| > it's
| > | > the normal behavior which is expected.
| > | > For datasourcecontrol and databindig control, after the object data
| > source
| > | > pass the data bojects to data controls, it no longer hold the actual
| > | > refernce of the oringial data(nor does the data binding control),
also
| > | > since the actual backend datasource may vary (maybe database or xml
| > file
| > | > or
| > | > ...), it don't quite makesense to maintain such a in-memory
reference.
| > In
| > | > fact, this also somewhat related to the ASP.NET application's
runtime
| > | > model, it's request/response based, generally after page output
| > response
| > | > to
| > | > client, all the serverside objects will be disposed and in-memory
| > | > reference
| > | > will no longer make sense in the next page lifecycle. This is
| > diferent
| > | > from winform application. So in such scenario, we should update the
| > | > original object through its primary key value or retrieve the
| > reference
| > | > again from orginal datasource, e.g:
| > | >
| > | >
| > | > ======================
| > | >
| > | > private static List<Employee> _list;
| > | > ......
| > | >
| > | > public static void UpdateEmployee(Employee emp)
| > | > {
| > | > EmployeePredicate ep = new EmployeePredicate(emp.ID);
| > | >
| > | > Employee employee = _list.Find(ep.Assert);
| > | >
| > | > if (employee == null)
| > | > {
| > | > throw new Exception("Invalid Employee info in
| > | > UpdateEmployee()...");
| > | > }
| > | >
| > | > employee.Name = emp.Name;
| > | > employee.Email = emp.Email;
| > | > }
| > | >
| > | > public class EmployeePredicate
| > | > {
| > | > private long _id;
| > | >
| > | > public EmployeePredicate(long id)
| > | > {
| > | > _id = id;
| > | > }
| > | >
| > | > public bool Assert(Employee emp)
| > | > {
| > | > if (emp.ID == _id)
| > | > {
| > | > return true;
| > | > }
| > | > else
| > | > {
| > | > return false;
| > | > }
| > | > }
| > | >
| > | > }
| > | >
| > | > ============================
| > | >
| > | > Thanks,
| > | >
| > | > Steven Cheng
| > | > Microsoft Online Support
| > | >
| > | > Get Secure! www.microsoft.com/security
| > | > (This posting is provided "AS IS", with no warranties, and confers
no
| > | > rights.)
| > | >
| > | >
| > | >
| > | >
| > | > --------------------
| > | > | From: "Ole M" <ol**@community.nospam>
| > | > | Subject: ObjectDataSource in ASP.NET 2.0
| > | > | Date: Mon, 31 Oct 2005 22:03:59 +0100
| > | > | Lines: 113
| > | > | X-Priority: 3
| > | > | X-MSMail-Priority: Normal
| > | > | X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| > | > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| > | > | X-RFC2646: Format=Flowed; Original
| > | > | Message-ID: <#a**************@TK2MSFTNGP10.phx.gbl>
| > | > | Newsgroups: microsoft.public.dotnet.framework.aspnet
| > | > | NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
| > | > | Path:
| > TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP10.phx.gbl
| > | > | Xref: TK2MSFTNGXA01.phx.gbl
| > | > microsoft.public.dotnet.framework.aspnet:135092
| > | > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
| > | > |
| > | > | I'm having some trouble using the ObjectDataSource in ASP.NET 2.0.
| > | > |
| > | > | I have a wrapper that contains the static methods for Select and
| > Update.
| > | > The
| > | > | Update-method takes the business object as parameter.
| > | > |
| > | > | When the Update-method is invoked by the ObjectDataSource, the
| > object
| > | > | referenced is not the same object returned by the Select-method,
but
| > a
| > | > new
| > | > | object with only the values from the Edit-template. So basically I
| > get a
| > | > | reference to a useless object here because it cannot be used by
the
| > DAL.
| > | > |
| > | > | Is this a bug or a feature?
| > | > |
| > | > | Here is some code to illustrate:
| > | > |
| > | > | <asp:GridView ID="GridView1" runat="server"
| > AutoGenerateColumns="False"
| > | > | DataSourceID="ObjectDataSource1">
| > | > |
| > | > | <Columns>
| > | > |
| > | > | <asp:CommandField ShowEditButton="True" />
| > | > |
| > | > | <asp:BoundField DataField="Name" HeaderText="Name"
| > SortExpression="Name"
| > | > />
| > | > |
| > | > | </Columns>
| > | > |
| > | > | </asp:GridView>
| > | > |
| > | > | <asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
| > | > | DataObjectTypeName="Customer"
| > | > |
| > | > | SelectMethod="GetCustomers" TypeName="MyWrapperObj"
| > | > | UpdateMethod="Save"></asp:ObjectDataSource>
| > | > |
| > | > | And the C#-code:
| > | > |
| > | > | public class Customer
| > | > |
| > | > | {
| > | > |
| > | > | private int id;
| > | > |
| > | > | public int Id
| > | > |
| > | > | {
| > | > |
| > | > | get { return id; }
| > | > |
| > | > | set { id = value; }
| > | > |
| > | > | }
| > | > |
| > | > | private string name;
| > | > |
| > | > | public string Name
| > | > |
| > | > | {
| > | > |
| > | > | get { return name; }
| > | > |
| > | > | set { name = value; }
| > | > |
| > | > | }
| > | > |
| > | > | public void Save()
| > | > |
| > | > | {
| > | > |
| > | > | // Do some things here...
| > | > |
| > | > | }
| > | > |
| > | > | }
| > | > |
| > | > | public class MyWrapperObj
| > | > |
| > | > | {
| > | > |
| > | > | public static IList<Customer> GetCustomers()
| > | > |
| > | > | {
| > | > |
| > | > | List<Customer> customers = new List<Customer>();
| > | > |
| > | > | for (int i = 0; i < 10; i++)
| > | > |
| > | > | {
| > | > |
| > | > | Customer customer = new Customer();
| > | > |
| > | > | customer.Id = i;
| > | > |
| > | > | customer.Name = string.Format("Name {0}", i);
| > | > |
| > | > |
| > | > | customers.Add(customer);
| > | > |
| > | > | }
| > | > |
| > | > | return customers;
| > | > |
| > | > | }
| > | > |
| > | > | public static void Save(Customer obj)
| > | > |
| > | > | {
| > | > |
| > | > | obj.Save(); // This object is NOT in the IList returned by
| > | > GetCustomers()
| > | > |
| > | > | }
| > | > |
| > | > | }
| > | > |
| > | > |
| > | > |
| > | >
| > |
| > |
| > |
| >
|
|
|

Nov 19 '05 #6

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

12
by: Jim Hammond | last post by:
I am passing the whole object instead or parameters in my select and update methods. I can get the updated object if I set UpdateMethod, let ASP.NET autogenerate an update button, and then press...
3
by: avezina | last post by:
We would like to use those new cool features of Asp.Net 2.0 like the ObjectDataSource in our project. I tried few basics examples and its work well. Let's say I have a page that displays a...
0
by: Eiriken | last post by:
Hello everyone, I am using ASP.NET 2 and trying to bind a objectdatasource to a gridview. By doing this the most common way by adding an objectdatasource to the page and by using the wizard to...
2
by: J055 | last post by:
Hi I've implemented caching for my ObjectDataSource. <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" EnableCaching="True" CacheDuration="10" CacheExpirationPolicy="Sliding" ...
0
by: Northern | last post by:
Hello, I have some trouble to declare and instantiate dynamically an ObjectDataSource in the codebehind file. The idea is to bind the objectdatasource to a gridview and have automate sorting and...
10
by: J055 | last post by:
Hi I've been trying out SqlCacheDependency using the ObjectDataSource and SQL Server 2005. It all works quite well with the minimum of configuration, e.g. <asp:ObjectDataSource...
14
by: Rolf Welskes | last post by:
Hello, I have an ObjectDataSource which has as business-object a simple array of strings. No problem. I have an own (custom) control to which I give the DataSourceId and in the custom-control...
5
by: Randy Smith | last post by:
Hi ALL, I wonder if anyone has been using n-tier to bind to a GridView control by using the ObjectDataSource. This is our first OOP web application, and we have no tables. Right now we are...
3
by: btreddy | last post by:
Hii all, I've a problem regarding passing select parameters to objectdatasource from code behind. i would like to pass the select parameters to a objectdatasource ..not in the selecting or...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.