ObjectDataSource in ASP.NET 2.0

Discussion in 'ASP .Net' started by Ole M, Oct 31, 2005.

  1. Ole M

    Ole M Guest

    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()

    }

    }
    Ole M, Oct 31, 2005
    #1
    1. Advertising

  2. 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" <>
    | 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: <#>
    | Newsgroups: microsoft.public.dotnet.framework.aspnet
    | NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
    | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.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()
    |
    | }
    |
    | }
    |
    |
    |
    Steven Cheng[MSFT], Nov 1, 2005
    #2
    1. Advertising

  3. Ole M

    Ole M Guest

    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]" <> skrev i melding
    news:...
    > 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" <>
    > | 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: <#>
    > | Newsgroups: microsoft.public.dotnet.framework.aspnet
    > | NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
    > | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.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()
    > |
    > | }
    > |
    > | }
    > |
    > |
    > |
    >
    Ole M, Nov 1, 2005
    #3
  4. 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" <>
    | References: <#>
    <>
    | 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: <>
    | Newsgroups: microsoft.public.dotnet.framework.aspnet
    | NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
    | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP12.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]" <> skrev i melding
    | news:...
    | > 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" <>
    | > | 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: <#>
    | > | Newsgroups: microsoft.public.dotnet.framework.aspnet
    | > | NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
    | > | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.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()
    | > |
    | > | }
    | > |
    | > | }
    | > |
    | > |
    | > |
    | >
    |
    |
    |
    Steven Cheng[MSFT], Nov 2, 2005
    #4
  5. Ole M

    Ole M Guest

    Hi,

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

    Thanks alot for the help!

    "Steven Cheng[MSFT]" <> skrev i melding
    news:...
    > 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" <>
    > | References: <#>
    > <>
    > | 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: <>
    > | Newsgroups: microsoft.public.dotnet.framework.aspnet
    > | NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
    > | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP12.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]" <> skrev i melding
    > | news:...
    > | > 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" <>
    > | > | 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: <#>
    > | > | Newsgroups: microsoft.public.dotnet.framework.aspnet
    > | > | NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
    > | > | Path:
    > TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.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()
    > | > |
    > | > | }
    > | > |
    > | > | }
    > | > |
    > | > |
    > | > |
    > | >
    > |
    > |
    > |
    >
    Ole M, Nov 2, 2005
    #5
  6. 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" <>
    | References: <#>
    <>
    <>
    <>
    | 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: <#>
    | Newsgroups: microsoft.public.dotnet.framework.aspnet
    | NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
    | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!tk2msftngp13.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]" <> skrev i melding
    | news:...
    | > 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" <>
    | > | References: <#>
    | > <>
    | > | 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: <>
    | > | Newsgroups: microsoft.public.dotnet.framework.aspnet
    | > | NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
    | > | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP12.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]" <> skrev i melding
    | > | news:...
    | > | > 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" <>
    | > | > | 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: <#>
    | > | > | Newsgroups: microsoft.public.dotnet.framework.aspnet
    | > | > | NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
    | > | > | Path:
    | > TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.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()
    | > | > |
    | > | > | }
    | > | > |
    | > | > | }
    | > | > |
    | > | > |
    | > | > |
    | > | >
    | > |
    | > |
    | > |
    | >
    |
    |
    |
    Steven Cheng[MSFT], Nov 2, 2005
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Microsoft news
    Replies:
    2
    Views:
    9,259
  2. Kristof Van Praet

    ASP.NET 2.0 ObjectDataSource question

    Kristof Van Praet, Jun 23, 2005, in forum: ASP .Net
    Replies:
    1
    Views:
    428
    Karl Seguin
    Jun 23, 2005
  3. =?Utf-8?B?UmFt?=

    Asp.net databinding to objectdatasource

    =?Utf-8?B?UmFt?=, Dec 1, 2005, in forum: ASP .Net
    Replies:
    3
    Views:
    4,823
    vivekkumar_gupta
    Sep 28, 2008
  4. =?Utf-8?B?T2xkbWFu?=

    ASP.NET 2.0 ObjectDataSource caching

    =?Utf-8?B?T2xkbWFu?=, Dec 7, 2005, in forum: ASP .Net
    Replies:
    3
    Views:
    2,135
    =?Utf-8?B?T2xkbWFu?=
    Dec 9, 2005
  5. David Thielen

    ObjectDataSource method as another ObjectDataSource

    David Thielen, Mar 21, 2006, in forum: ASP .Net Web Controls
    Replies:
    3
    Views:
    241
    Steven Cheng[MSFT]
    Mar 23, 2006
Loading...

Share This Page