1.首先确认LinkButton控件包含在Form中,检查该Form有无runat标记,若是有,排除Form缘由,请继续看。html
2.若是看到这里,估计你是在作Excel导出功能。在后台代码中重写VerifyRenderingInServerForm方法:web
public override void VerifyRenderingInServerForm(Control control) 浏览器
{ 服务器
// Confirms that an HtmlForm control is rendered for app
} ide
我的认为,出现此问题的缘由是导出Excel时,浏览器响应的类型为context.Response.ContentType=" application/excel " ; 而很是规的"text/html"类型,此时浏览器响应服务器下载Excel,已经"忘 记"当前页面(不知道这么说恰不恰当),只记得响应当前用户的Excel导出请求,故出现LinkButton没有加载在Form中的异常状况。post
MSDN对此方法的解释:ui
必须位于 <form runat=server> 标记中的控件能够在呈现以前调用此方法,以便在控件被置于标记外时显示错误消息。 发送回或依赖于注册的脚本块的控件应该在 Control.Render 方法的重写中调用此方法。 呈现服务器窗体元素的方式不一样的页能够重写此方法以在不一样的条件下引起异常。this
若是回发或使用客户端脚本的服务器控件没有包含在 HtmlForm 服务器控件 (<form runat="server">) 标记中,它们将没法正常工做。 这些控件能够在呈现时调用该方法,以在它们没有包含在 HtmlForm 控件中时提供明确的错误消息。spa
开发自定义服务器控件时,一般在为任何类型的输入标记重写 Render 方法时调用该方法。 这在输入控件调用 GetPostBackEventReference 或发出客户端脚本时尤为重要。 复合服务器控件不须要做出此调用。
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" %>