UpdatePanel中的文本框导致pagerequestmanagerservererroreexception

本文关键字:pagerequestmanagerservererroreexception 文本 UpdatePanel | 更新日期: 2023-09-27 18:06:38

我试图创建一个页面,在绑定标签和编辑按钮中有一些信息。当单击编辑按钮时,信息将被绑定到相同数据的TextBoxes所替换。然后可以修改数据,保存回数据库,并用更新后的标签替换TextBoxes。

首先,为了保持简单,我所有的是一个UpdatePanelDataList和两个按钮:EditButtonCancelButton (CancelButton是默认隐藏的)。DataListItemTemplate有两个面板:ViewPanelEditPanel (EditPanel默认是隐藏的)。当点击EditButton时,我隐藏EditButtonDataListItems ' ViewPanel,显示CancelButtonDataListItems ' EditPanel
没问题。然而,一旦这样做了,CancelButton按钮将不工作,抛出PageRequestManagerServerErrorException .

通过一些摆弄,我发现这是因为EditPanel上有绑定文本框。如果我不将数据绑定到文本框,一切都可以正常工作。为什么这行不通呢?

下面是我的代码:

UpdatePanelTest.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="UpdatePanelTest.aspx.cs" Inherits="WebLetterViewer.UpdatePanelTest" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true"></asp:ScriptManager>
    <asp:SqlDataSource ID="AllLettersDataSource" runat="server" 
        ConnectionString="<%$ ConnectionStrings:ORMSTestConnectionString %>" 
        SelectCommand="SELECT * FROM [Letters] WHERE ([id] = @id)">
        <SelectParameters>
            <asp:ControlParameter ControlID="HiddenLetterID" DefaultValue="1" Name="id" PropertyName="Value" Type="Int32" />
        </SelectParameters>
    </asp:SqlDataSource>
    <asp:HiddenField ID="HiddenLetterID" runat="server" Value="1" />
    <div>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false">
            <ContentTemplate>
                <asp:DataList ID="LettersDataList" runat="server" DataSourceID="AllLettersDataSource">
                    <ItemTemplate>
                        <asp:Panel ID="ViewPanel" runat="server">
                            <h2>Data1:</h2>
                            <asp:Label ID="data1Label" runat="server" BorderStyle="Solid" BorderWidth="1px" Height="100px" Text='<%# Eval("data1") %>' Width="500px" />
                            <h2>data2:</h2>
                            <asp:Label ID="data2Label" runat="server" BorderStyle="Solid" BorderWidth="1px" Height="100px" Text='<%# Eval("data2") %>' Width="500px" />
                            <h2>data3:</h2>
                            <asp:Label ID="data3Label" runat="server" BorderStyle="Solid" BorderWidth="1px" Height="100px" Text='<%# Eval("data3") %>' Width="500px" />
                        </asp:Panel>
                        <asp:Panel ID="EditPanel" runat="server" Visible="False">
                            <h2>data1:</h2>
                            <asp:TextBox ID="data1TextBox" runat="server" Height="100px" Text='<%# Eval("data1", "{0}") %>' TextMode="MultiLine" Width="500px"></asp:TextBox>
                            <h2>data2:</h2>
                            <asp:TextBox ID="data2TextBox" runat="server" Height="100px" Text='<%# Eval("data2", "{0}") %>' TextMode="MultiLine" Width="500px"></asp:TextBox>
                            <h2>data3:</h2>
                            <asp:TextBox ID="data3TextBox" runat="server" Height="100px" Text='<%# Eval("data3", "{0}") %>' TextMode="MultiLine" Width="500px"></asp:TextBox>
                        </asp:Panel>
                    </ItemTemplate>
                </asp:DataList>
                <asp:Button ID="EditButton" runat="server" onclick="EditButton_Click" Text="Edit" />
                <asp:Button ID="CancelButton" runat="server" onclick="CancelButton_Click" Text="Cancel" Visible="False" />
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    </form>
</body>
</html>

UpdatePanelTest.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebLetterViewer{
    public partial class UpdatePanelTest : System.Web.UI.Page{
        protected void Page_Load(object sender, EventArgs e){
        }
        protected void EditButton_Click(object sender, EventArgs e){
            foreach (DataListItem item in LettersDataList.Items){
                item.FindControl("ViewPanel").Visible = false;
                item.FindControl("EditPanel").Visible = true;
            }
            EditButton.Visible = false;
            CancelButton.Visible = true;
            UpdatePanel1.Update();
        }
        protected void CancelButton_Click(object sender, EventArgs e){
            foreach (DataListItem item in LettersDataList.Items){
                item.FindControl("ViewPanel").Visible = true;
                item.FindControl("EditPanel").Visible = false;
            }
            EditButton.Visible = true;
            CancelButton.Visible = false;
            UpdatePanel1.Update();
        }
    }
}

UpdatePanel中的文本框导致pagerequestmanagerservererroreexception

EditPanel放在edittitemtemplate中并使用Commands,您没有按照设计的方式使用此控件:

如何:允许用户编辑DataList Web Server控件中的项

标记:

<asp:SqlDataSource ID="AllLettersDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:ORMSTestConnectionString %>"
        SelectCommand="SELECT * FROM [Letters] WHERE ([id] = @id)">
        <SelectParameters>
            <asp:ControlParameter ControlID="HiddenLetterID" DefaultValue="1" Name="id" PropertyName="Value"
                Type="Int32" />
        </SelectParameters>
        <!--change this -->
        UpdateCommand="UPDATE [Categories] SET [CategoryName] = @CategoryName, [Description]
        = @Description WHERE [CategoryID] = @original_CategoryID">
        <UpdateParameters>
            <asp:Parameter Name="CategoryName" Type="String" />
            <asp:Parameter Name="Description" Type="String" />
            <asp:Parameter Name="original_CategoryID" Type="Int32" />
        </UpdateParameters>
    </asp:SqlDataSource>
    <asp:DataList ID="LettersDataList" runat="server" DataSourceID="AllLettersDataSource"
        OnEditCommand="LettersDataList_EditCommand" OnCancelCommand="LettersDataList_CancelCommand"
        OnUpdateCommand="LettersDataList_UpdateCommand">
        <ItemTemplate>
            <asp:Panel ID="ViewPanel" runat="server">
                <h2>
                    Data1:</h2>
                <asp:Label ID="data1Label" runat="server" BorderStyle="Solid" BorderWidth="1px" Height="100px"
                    Text='<%# Eval("data1") %>' Width="500px" />
                <h2>
                    data2:</h2>
                <asp:Label ID="data2Label" runat="server" BorderStyle="Solid" BorderWidth="1px" Height="100px"
                    Text='<%# Eval("data2") %>' Width="500px" />
                <h2>
                    data3:</h2>
                <asp:Label ID="data3Label" runat="server" BorderStyle="Solid" BorderWidth="1px" Height="100px"
                    Text='<%# Eval("data3") %>' Width="500px" />
            </asp:Panel>
            <asp:Button ID="EditButton" runat="server" CommandName="edit" Text="Edit" />
        </ItemTemplate>
        <EditItemTemplate>
            <asp:Panel ID="EditPanel" runat="server">
                <h2>
                    data1:</h2>
                <asp:TextBox ID="data1TextBox" runat="server" Height="100px" Text='<%# Eval("data1", "{0}") %>'
                    TextMode="MultiLine" Width="500px"></asp:TextBox>
                <h2>
                    data2:</h2>
                <asp:TextBox ID="data2TextBox" runat="server" Height="100px" Text='<%# Eval("data2", "{0}") %>'
                    TextMode="MultiLine" Width="500px"></asp:TextBox>
                <h2>
                    data3:</h2>
                <asp:TextBox ID="data3TextBox" runat="server" Height="100px" Text='<%# Eval("data3", "{0}") %>'
                    TextMode="MultiLine" Width="500px"></asp:TextBox>
            </asp:Panel>
            <asp:LinkButton ID="LinkButton1" runat="server" CommandName="update">
                    Save
            </asp:LinkButton>
            &nbsp;
            <asp:Button ID="CancelButton" runat="server" CommandName="cancel" Text="Cancel" Visible="False" />
        </EditItemTemplate>
    </asp:DataList>

后台代码:

    protected void LettersDataList_EditCommand(object source, DataListCommandEventArgs e)
    {
        LettersDataList.EditItemIndex = e.Item.ItemIndex;
        LettersDataList.DataBind();
    }
    protected void LettersDataList_CancelCommand(object source,
        DataListCommandEventArgs e)
    {
        LettersDataList.EditItemIndex = -1;
        LettersDataList.DataBind();
    }
    protected void LettersDataList_UpdateCommand(object source,
        DataListCommandEventArgs e)
    {
        //change this to your database needs
        //String categoryID =
        //     LettersDataList.DataKeys[e.Item.ItemIndex].ToString();
        //String categoryName =
        //     ((TextBox)e.Item.FindControl("textCategoryName")).Text;
        //String description =
        //     ((TextBox)e.Item.FindControl("textDescription")).Text;
        //SqlDataSource1.UpdateParameters["original_CategoryID"].DefaultValue
        //    = categoryID;
        //SqlDataSource1.UpdateParameters["categoryName"].DefaultValue
        //    = categoryName;
        //SqlDataSource1.UpdateParameters["Description"].DefaultValue
        //    = description;
        //SqlDataSource1.Update();
        LettersDataList.EditItemIndex = -1;
        LettersDataList.DataBind();
    }
相关文章:
  • 没有找到相关文章