回发后,将不同的控制权分配给同一 ID - ASP.NET

Different control is assigned to the same ID after postback - ASP.NET

提问人:Michael Kniskern 提问时间:12/10/2013 更新时间:12/10/2013 访问量:3956

问:

我最近将我的一个旧 ASP.NET 应用程序从 .NET 2.0 更新到 .NET 4.5,它是我尝试使用该控件的首批应用程序之一。它是一个调查应用程序,用户可以在其中创建调查,为调查分配多个问题组,为每个问题组分配多个问题类型。asp:UpdatePanel

当我使用用户可以编辑调查内容的页面时,该页面包含注册到在页面上注册的有问题类型的用户控件中的 asp.net 控件的对象,出现以下错误:AsyncPostBackTriggerLinkButton

错误:Sys.WebForms.PageRequestManagerServerErrorException:错误 发生是因为 ID 为 找不到“ctl00$PageBody$gvSurveyQuestions$ctl02$ctl03”,或者 回发后,将不同的控件分配给同一 ID。如果 未分配 ID,则显式设置控件的 ID 属性 引发回发事件以避免此错误。

用户控件是根据用户选择作为组一部分的控件动态生成的。如果是控件,它会根据所选问题类型确定要显示的用户控件。下面是一段代码:OnRowCommandDataGrid

调查 ASPX 页面:

//grid control to allow user to select the question to edit
<asp:GridView ID="gvSurveyQuestions" runat="server" AutoGenerateColumns="false" 
    OnRowCommand="gvSurveyQuestions_OnRowCommand" 
    OnRowEditing="gvSurveyQuestions_OnRowEditing" 
    OnRowDeleting="gvSurveyQuestions_OnRowDeleting" 
    CssClass="com_grid"
    Width="100%" 
    CellPadding="3" 
    CellSpacing="0"
>
    <asp:CommandField ButtonType="Link" ShowEditButton="True" ShowDeleteButton="True" 
        ItemStyle-HorizontalAlign="Center" />
</asp:GridView>
<asp:PlaceHolder ID="phEditExcellentPoor" runat="server" Visible="false">
    <tr>
        <td width="100%">
            <uc:ExcellentPoor Id="ucEditExcellentPoor" runat="server" EditMode="Edit" />
        </td>
    </tr>
</asp:PlaceHolder>

ASPX 页的代码隐藏:

private readonly string m_CreateUpdateQuestionControlName = "lbCreateUpdateQuestion";
private readonly string m_CreateUpdateQuestionText_Edit = "Update Question";

protected void Page_Init(object sender, EventArgs e)
{
    //here is the code to set the async postback trigger
    AsyncPostBackTrigger apExcellentPoorEdit = new AsyncPostBackTrigger();
    apExcellentPoorEdit.ControlID = ucEditExcellentPoor.FindControl(this.m_CreateUpdateQuestionControlName).UniqueID;
    upSurveyQuestions.Triggers.Add(apExcellentPoorEdit);
}

用户控件的代码隐藏,用于将链接按钮设置为调查 ASPX 页上的回发触发器:

public event EventHandler lbCreateUpdateQuestionClick;

protected void lbCreateUpdateQuestion_OnClick(object sender, EventArgs e)
{
    if (this.lbCreateUpdateQuestionClick != null)
        this.lbCreateUpdateQuestionClick(sender, e);
}

为什么我收到这个错误,有什么好的建议可以看看在哪里修复它?

C# asp.net 用户控件 UpdatePanel AsyncPostBackError

评论


答:

0赞 geedubb 12/10/2013 #1

切换时,似乎具有多个 CommandField 的 Gridview 不起作用 到 .Net Framework 4.0。我想这是因为一个人不能 为 gridView 中的命令字段提供一个 ID,因此在本例中 编译器在内部为第一个命令字段分配控件 ID 当它遇到第二个时,它会分配相同的控件 ID 再。因此,在回发期间,当我尝试重新加载网格视图时,请说何时 编辑一行时,会遇到多个具有相同 ID 的控件,并且 引发此服务器错误。

我删除了命令字段,而是将它们替换为 TemplateField 中的 Image按钮解决了我的问题。:)

本文由本文提供

评论

0赞 Michael Kniskern 12/10/2013
我的页面上确实有两个包含列的控件。要重构,看看这是否能解决我的问题。asp:GridViewasp:CommandFieldasp:ButtonField
0赞 Michael Kniskern 12/10/2013
在控件中替换两列时仍然遇到相同的错误asp:CommandFieldasp:ButtonFieldasp:GridView
0赞 Michael Kniskern 12/10/2013
我将能够使用这篇文章中提供的答案来解决我的问题: stackoverflow.com/a/18567488/26327
0赞 Michael Kniskern 12/10/2013 #2

我能够通过将“编辑”和“删除”链接替换为“替换为”,并将“编辑”重命名为“Edt”,将“删除”重命名为“Del”来解决我的问题asp:CommandFieldasp:ButtonFieldCommandName

这篇文章最终帮助解决了这个问题