關於類型「LinkButton」的控件「xxx」必須放在具備 runat=server 的窗體標記內問題的解決方案

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" %>

相關文章
相關標籤/搜索