在回发后,将不同的控件分配给相同的ID - ASP.NET

时间:2013-12-09 21:02:50

标签: c# asp.net user-controls updatepanel asyncpostbackerror

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

当我使用用户可以编辑包含AsyncPostBackTrigger对象的LinkButton个对象的调查内容的页面时,在页面上注册的问题类型用户控件中,我得到了以下错误:

  

错误:Sys.WebForms.PageRequestManagerServerErrorException:错误   因为带有id的控件而发生了   无法找到'ctl00 $ PageBody $ gvSurveyQuestions $ ctl02 $ ctl03'或   在回发后将不同的控件分配给相同的ID。如果   未分配ID,显式设置控件的ID属性   引发回发事件以避免此错误。

用户控件是根据用户选择作为组的一部分的控件动态生成的。在OnRowCommand控件的DataGrid事件中,它根据所选问题的类型确定要显示哪个用户控件。这是一段代码:

调查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);
}

为什么我收到此错误以及哪些好建议可以找到解决问题的方法?

2 个答案:

答案 0 :(得分:0)

  

似乎Gridview与多个CommandField在切换时无法正常工作   到.Net Framework 4.0。我猜它是因为一个人不能   给gridview中的命令字段一个id,所以在这种情况下   编译器在内部为第一个命令字段分配控件ID   当遇到第二个时,它会分配相同的控件ID   再次。所以在回发期间我尝试重新加载gridview时说   在编辑一行时,它会遇到具有相同ID和的多个控件   抛出此服务器错误。

     

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

This post提供

答案 1 :(得分:0)

我能够通过将asp:CommandField替换为asp:ButtonField替换编辑和删除链接并将CommandName修改重命名为 Edt 和删除 Del

post有助于最终解决问题