OldValues collection in event “ItemUpdating” of De

2019-07-13 10:22发布

I´m using a DetailsView but when updating, I cannot get the OldValues because the DetailsViewUpdateEventArgs.OldValues of ItemUpdating event is always empty. The NewValues has the values ok.

Note: I´m not using a datasource component in my application (SqlDataSource, ObjectDataSource, EntityDataSource, etc.). In this case should I do something manually?

Any ideas will be welcome!

Thanks!

Complementing the information:

I´m using ASP.NET 4.0 (WebForms)

A snippet of code that I believe to be relevant below:

<asp:DetailsView ID="customerDetails" runat="server" AutoGenerateRows="False" EmptyDataText="No data..." 
    meta:resourcekey="customerDetails" 
    onitemdeleting="customerDetails_ItemDeleting" 
    oniteminserting="customerDetails_ItemInserting" 
    onitemupdating="customerDetails_ItemUpdating" 
    onmodechanging="customerDetails_ModeChanging" 
    CssClass="customerDetails" DataKeyNames="CustomerID">
    <FooterTemplate>
        <asp:LinkButton ID="lnkNew" Text="New" ToolTip="New Customer" CommandName="New" meta:resourcekey="lnkNew" runat="server" />
    </FooterTemplate>
    <EmptyDataTemplate>
        <p><asp:Label ID="lblNoDataHasBeenFound" Text="No data has been found." meta:resourcekey="lblNoDataHasBeenFound" runat="server" /></p>
        <asp:LinkButton ID="lnkNew" Text="New" ToolTip="New Customer" CommandName="New" meta:resourcekey="lnkNew" runat="server" />
    </EmptyDataTemplate>
    <Fields>
        <%--CustomerID--%>
        <asp:TemplateField HeaderStyle-CssClass="detailsHeader" ItemStyle-CssClass="detailsField">
            <HeaderTemplate>
                <asp:Label ID="ltrCustomerIdLabel" meta:resourcekey="ltrCustomerId" Text="CustomerID:" runat="server" />
            </HeaderTemplate>
            <ItemTemplate>
                <asp:Label ID="lblCustomerId" Text='<%# Eval("CustomerID") %>' runat="server"  />
            </ItemTemplate>
            <EditItemTemplate>
                <asp:Label ID="lblCustomerId" Text='<%# Eval("CustomerID") %>' runat="server"  />
            </EditItemTemplate>
            <InsertItemTemplate>
                <asp:TextBox ID="txtCustomerId" Text='<%# Bind("CustomerID") %>' MaxLength="5" width="50px" runat="server" />
                <cc1:DataAnnotationsValidator ID="CustomerIdValidator" Type="String" runat="server" ControlToValidate="txtCustomerId" PropertyName="CustomerID" Text="*" SourceType="DataLayerPOCO.Customer, DataLayerPOCO" CssError="validationError" Display="None"/>
            </InsertItemTemplate>
            <HeaderStyle HorizontalAlign="Right" />
            <ItemStyle HorizontalAlign="Left" />
        </asp:TemplateField>

        <%--CompanyName--%>
        <asp:TemplateField HeaderStyle-CssClass="detailsHeader" ItemStyle-CssClass="detailsField">
            <HeaderTemplate>
                <asp:Literal ID="ltrCompanyNameLabel" meta:resourcekey="ltrCompanyName" Text="Company Name:" runat="server" />
            </HeaderTemplate>
            <ItemTemplate>
                <asp:Literal ID="ltrCompanyName" Text='<%# Eval("CompanyName") %>' runat="server"/>
            </ItemTemplate>
            <EditItemTemplate>
                <asp:TextBox ID="txtCompanyName" Text='<%# Bind("CompanyName") %>' MaxLength="40" Width="310px"
                    runat="server" />
                <cc1:DataAnnotationsValidator ID="CompanyNameValidator" Type="String" runat="server" ControlToValidate="txtCompanyName" PropertyName="CompanyName" Text="*" SourceType="DataLayerPOCO.Customer, DataLayerPOCO" CssError="validationError" Display="None"/>
            </EditItemTemplate>
            <InsertItemTemplate>
                <asp:TextBox ID="txtCompanyName" Text='<%# Bind("CompanyName") %>' MaxLength="40" Width="310px"
                    runat="server" />
                <cc1:DataAnnotationsValidator ID="CompanyNameValidator" Type="String" runat="server" ControlToValidate="txtCompanyName" PropertyName="CompanyName" Text="*" SourceType="DataLayerPOCO.Customer, DataLayerPOCO" CssError="validationError" Display="None"/>
            </InsertItemTemplate>
            <HeaderStyle HorizontalAlign="Right" />

        </asp:TemplateField>
        ...
        ...
        other fields goes here
        ...
        ...
        <%--Edit/Insert--%>
        <asp:TemplateField HeaderStyle-CssClass="detailsHeader" ItemStyle-CssClass="detailsField">
            <ItemTemplate>
                <asp:ImageButton ID="imgEdit" ImageUrl="~/img/pencil.png" meta:resourcekey="imgEdit" AlternateText="Edit" ToolTip="Edit Customer" CommandName="Edit" runat="server" CausesValidation="false"/>
                <asp:ImageButton ID="imgDelete" ImageUrl="~/img/delete.png" meta:resourcekey="imgDelete" AlternateText="Delete" ToolTip="Delete Customer" CommandName="Delete" OnClientClick="return confirmDelete();" runat="server" CausesValidation="false"/>
            </ItemTemplate>
            <EditItemTemplate>
                <asp:ImageButton ID="imgUpdate" ImageUrl="~/img/accept.png" meta:resourcekey="imgUpdate" AlternateText="Update" ToolTip="Update Customer" CommandName="Update" runat="server" />
                <asp:ImageButton ID="imgCancel" ImageUrl="~/img/cancel.png" meta:resourcekey="imgCancel" AlternateText="Cancel" ToolTip="Cancel Edit" CommandName="Cancel" runat="server" CausesValidation="false"/>
            </EditItemTemplate>
            <InsertItemTemplate>
                <asp:ImageButton ID="imgSave" ImageUrl="~/img/disk.png" meta:resourcekey="imgSave" AlternateText="Save" ToolTip="Save Customer Data" CommandName="Insert" runat="server" CausesValidation="true"/>
                <asp:ImageButton ID="imgCancelInsert" ImageUrl="~/img/cancel.png" meta:resourcekey="imgCancelInsert" AlternateText="Cancel" ToolTip="Cancel Insert" CommandName="Cancel" runat="server" CausesValidation="false"/>
            </InsertItemTemplate>
        </asp:TemplateField>
    <Fields>
</asp:DetailsView>

The event ItemUpdating is like below:

    protected void customerDetails_ItemUpdating(object sender, DetailsViewUpdateEventArgs e)
    {
        repository = repository ?? new NorthwindRepositoryEF();

        string id = e.Keys["CustomerID"] as string;

        DataLayerPOCO.Customer customer = repository.GetCustomer(id);

        string companyName = (string)e.NewValues["CompanyName"];
        string contactName = (string)e.NewValues["ContactName"];
        string contactTitle = (string)e.NewValues["ContactTitle"];
        string address = (string)e.NewValues["Address"];
        string city = (string)e.NewValues["City"];
        string region = (string)e.NewValues["Region"];
        string postalCode = (string)e.NewValues["PostalCode"];
        string country = (string)e.NewValues["Country"];
        string phone = (string)e.NewValues["Phone"];
        string fax = (string)e.NewValues["Fax"];

        // Update Customer with the new data
        customer.CompanyName = companyName;
        customer.ContactName = contactName;
        customer.ContactTitle = contactTitle;
        customer.Address = address;
        customer.City = city;
        customer.Region = region;
        customer.PostalCode = postalCode;
        customer.Country = country;
        customer.Phone = phone;
        customer.Fax = fax;

        repository.UpdateCustomer(customer);
        repository.Save();
        //---
        customerDetails.ChangeMode(DetailsViewMode.ReadOnly);
        BindCustomerDetails();
        BindCustomersList();

    }

The problem is that if I want to handle the old values, I can´t:

this, evaluates to 0: int oldValuesCount = e.OldValues.Count;

and this, evaluates to null, even if I alter the value to a new one: string companyNameOld = e.OldValues["CompanyName"] as string;

1条回答
冷血范
2楼-- · 2019-07-13 11:13

It seems the old values are only populated when you have a data source bounded declaratively.

You have two workarounds in this case:

  1. Save any old values you may need in ViewState programtically and retrieve it when you want it. This save a trip to the database.

  2. A better option would to use the customer variable that you define in OnItemUpdating as it queries information from the database and contains all the old values.

Hope it helps.

查看更多
登录 后发表回答