必须将带有’LinkButton’类型的控件xxx放在带有runat = server的表单标签内
我有一个DataGrid ,我试图在单击一个ASP.NET 按钮时导出。
确切的错误是:
必须将带有’LinkButton’类型的控件’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 LinkButton控件,但每个控件都包含runat="server"
子句。
看来DataGrid中的LinkButton数据很难呈现为纯文本 。
如果没有,我的导出方法中是否有可以配置的内容,以便将DataGrid数据全部解释为文本?
我可以创建一个空白的DataGrid,然后遍历填充的DataGrid,只写入每个字段的文本 – 但是如果绝对必要,我只想这样做。
我相信你只需要覆盖检查表单的方法。 您无需向该方法添加任何逻辑。 只需将以下内容添加到您的代码中:
public override void VerifyRenderingInServerForm(Control control) { }
ETA:您可能还需要在<%@Page />
元素中设置EnableEventValidation="false"
。