关于类型“LinkButton”的控件“xxx”必须放在具有 runat=server 的窗体标记内问题的解决方案

1.首先确认LinkButton控件包含在Form中,检查该Form有无runat标记,如果有,排除Form原因,请继续看。

2.如果看到这里,估计你是在做Excel导出功能。在后台代码中重写VerifyRenderingInServerForm方法:

    public override void VerifyRenderingInServerForm(Control control)    

   {        

        // Confirms that an HtmlForm control is rendered for    

   } 

      个人认为,出现此问题的原因是导出Excel时,浏览器响应的类型为context.Response.ContentType=" application/excel " ; 而非常规的"text/html"类型,此时浏览器响应服务器下载Excel,已经"忘 记"当前页面(不知道这么说恰不恰当),只记得响应当前用户的Excel导出请求,故出现LinkButton没有加载在Form中的异常情况。

MSDN对此方法的解释:

呈现服务器窗体元素的方式不同的页可以重写此方法以在不同的条件下引发异常。

HtmlForm 控件中时提供明确的错误消息。

复合服务器控件不需要作出此调用。

3.小伙伴们可能会发现,重写VerifyRenderingInServerForm后页面依然报错,不过不再报'类型“LinkButton”的控件“xxx”必须放在具有 runat=server 的窗体标记内'这个错了,这是一个好消息。具体错误信息为:只能在执行 Render() 的过程中调用 RegisterForEventValidation(RegisterForEventValidation can only be called during Render();)

解决办法:在前台aspx页面的page指令中添加EnableEventValidation = "false",修改如下:

<%@ Page Language="C#" EnableEventValidation = "false" AutoEventWireup="true" CodeFile="ExportRepeater.aspx.cs" Inherits="ExportRepeater" %>