必须将带有’LinkBut​​ton’类型的控件xxx放在带有runat = server的表单标签内

我有一个DataGrid ,我试图在单击一个ASP.NET 按钮时导出。

错误屏幕

确切的错误是:

必须将带有’LinkBut​​ton’类型的控件’ctl00_body_RollupDG_ctl02_btnShowGLdetail’放在带有runat = server的表单标记内。

我在这里发现了类似的问题,但似乎都表明这是因为ASP.NET控件没有放在ContentPlaceHolder中,或者ContentPlaceHolder 没有放在RunAt Server表单中。

我有这两个,所以情况并非如此。

我的ExportExcelFile方法捕获RenderControl()处的HttpException (如上面的屏幕截图所示)。 该代码如下:

protected void ExportExcelFile(object Sender, EventArgs e) { //export to excel var grdResults = (periodCriteria.SelectedValue == "year") ? RollupDG : QuarterDG; var response = HttpContext.Current.Response; response.Clear(); response.Charset = String.Empty; response.ContentType = "application/vnd.ms-excel"; response.AddHeader("Content-Disposition", "attachment; filename=GlBudgetReport.xls"); using (var sw = new StringWriter()) { using (var htw = new HtmlTextWriter(sw)) { grdResults.RenderControl(htw); response.Write(sw.ToString()); response.End(); } } } 

如下面的“ 查找结果”框中所示,有几个ASP.NET LinkBut​​ton控件,但每个控件都包含runat="server"子句。

查找结果

看来DataGrid中的LinkBut​​ton数据很难呈现为纯文本

如果没有,我的导出方法中是否有可以配置的内容,以便将DataGrid数据全部解释为文本?

我可以创建一个空白的DataGrid,然后遍历填充的DataGrid,只写入每个字段的文本 – 但是如果绝对必要,我只想这样做。

我相信你只需要覆盖检查表单的方法。 您无需向该方法添加任何逻辑。 只需将以下内容添加到您的代码中:

 public override void VerifyRenderingInServerForm(Control control) { } 

ETA:您可能还需要在<%@Page />元素中设置EnableEventValidation="false"