2011-06-14 38 views
72
<form runat="server" id="f1"> 
    <div runat="server" id="d"> 
     grid view: 
     <asp:GridView runat="server" ID="g"> 
     </asp:GridView> 
    </div> 

    <asp:TextBox runat="server" ID="t" TextMode="MultiLine" Rows="20" Columns="50"></asp:TextBox> 
</form> 

代碼後面內的形式標記內:的GridView必須放在與RUNAT =「服務器」,即使之後在GridView是一種形式標籤

public partial class ScriptTest : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     g.DataSource = new string[] { "a", "b", "c" }; 
     g.DataBind(); 

     TextWriter tw = new StringWriter(); 
     HtmlTextWriter h = new HtmlTextWriter(tw);  
     d.RenderControl(h); 
     t.Text = tw.ToString(); 
    } 
} 

即使在GridView是內從標籤帶RUNAT = 「服務器」,我仍然得到這個錯誤。

請提供任何線索嗎?

+2

我,如果有人使用已經有一個表單標籤的母版頁在此之前看到的(可能會或可能不會已經宣佈'RUNAT =「服務器」在'它是'

'標籤)。只是一個想法... – lhan 2011-06-14 12:53:51

+0

@勞埃德:但我沒有任何母版頁,我創建了此頁面僅用於測試此錯誤。 – teenup 2011-06-14 12:58:42

+0

嗨,我複製了你的代碼,但不能複製這個問題。你可以把整個文件內容(每一行)放到你的問題中,或者Pastebin中嗎?謝謝 – christofr 2011-06-14 13:01:32

回答

146

你打電話給GridView.RenderControl(htmlTextWriter),因此頁面引發了一個例外,即服務器控件在一個窗體之外被渲染。

你可以通過重寫VerifyRenderingInServerForm

public override void VerifyRenderingInServerForm(Control control) 
{ 
    /* Confirms that an HtmlForm control is rendered for the specified ASP.NET 
    server control at run time. */ 
} 

herehere避免這種execption。

+0

我有一個GridView,其內容我想呈現給電子郵件消息,這就是爲什麼我需要將它呈現出來的形式。我無法重寫此方法,因爲主機頁面是Sharepoint。 My Grid是Sharepoint頁面中Web部件的Usercontrol。 – teenup 2011-06-14 13:04:40

+0

另外,當我將GridView直接添加到HtmlForm中,然後渲染它時,它完美呈現。這意味着它只需要網格外的表單。但是,當我動態地將DIV添加到HtmlForm時,這個錯誤再次出現,儘管Grid是DIV的子項,並且也隨同它一起添加到HtmlForm中。 – teenup 2011-06-14 13:08:17

+0

@Tim Schmelter ...你是上帝!謝謝!! – DotNetRookie 2012-08-04 16:06:24

11

只需將您的Page_Load後補充一點:

public override void VerifyRenderingInServerForm(Control control) 
{ 
    //base.VerifyRenderingInServerForm(control); 
} 

請注意,我不這樣做的任何功能。

編輯:蒂姆回答同樣的事情。 :) 您還可以找到答案Here

26

重寫VerifyRenderingInServerForm的替代方法是在執行渲染時從控件集合中刪除網格,然後在加載頁面之前將其完全添加回去。如果你想有一些通用的幫助器方法來獲取網格html,這很有幫助,因爲你不必記得添加覆蓋。

Control parent = grid.Parent; 
int GridIndex = 0; 
if (parent != null) 
{ 
    GridIndex = parent.Controls.IndexOf(grid); 
    parent.Controls.Remove(grid); 
} 

grid.RenderControl(hw); 

if (parent != null) 
{ 
    parent.Controls.AddAt(GridIndex, grid); 
} 

另一種選擇,避免越權做到這一點:

grid.RenderBeginTag(hw); 
grid.HeaderRow.RenderControl(hw); 
foreach (GridViewRow row in grid.Rows) 
{ 
    row.RenderControl(hw); 
} 
grid.FooterRow.RenderControl(hw); 
grid.RenderEndTag(hw); 
+0

Adroit !!我明天會嘗試。 – teenup 2011-06-14 19:06:47

+0

當試圖呈現一個asp用戶控件(.ascx)中的網格時,使用第一種方法對我很好。 – 2014-03-12 21:13:39

+2

1.如果gridview包含像LinkBut​​ton這樣的控件,它就不起作用 - 它給出'控件的類型'LinkBut​​ton'必須放置在帶有runat = server'錯誤的表單標籤內。你能解釋爲什麼這項技術有效嗎? – BornToCode 2015-11-04 13:01:37

1

只想補充這樣做的另一種方式。我已經看到多個相關線程中的多個人詢問您是否可以使用VerifyRenderingInServerForm而不將其添加到父頁面。

你實際上可以做到這一點,但它有點閃光。

首先創建一個新的頁面類看起來像下面這樣:

public partial class NoRenderPage : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { } 

    public override void VerifyRenderingInServerForm(Control control) 
    { 
     //Allows for printing 
    } 

    public override bool EnableEventValidation 
    { 
     get { return false; } 
     set { /*Do nothing*/ } 
    } 
} 

並不需要有與之相關的.ASPX。

然後在想要渲染的控件中,可以執行類似下面的操作。

StringWriter tw = new StringWriter(); 
    HtmlTextWriter hw = new HtmlTextWriter(tw); 

    var page = new NoRenderPage(); 
    page.DesignerInitialize(); 
    var form = new HtmlForm(); 
    page.Controls.Add(form); 
    form.Controls.Add(pnl); 
    controlToRender.RenderControl(hw); 

現在,您已將原始控件呈現爲HTML。如果需要,請將控制權重新添加到原始位置。您現在已經呈現了HTML,頁面正常並且沒有更改頁面本身。

+0

太多的代碼來實現一些簡單的事情。 – SearchForKnowledge 2015-06-05 15:21:46

+0

@DanielEdwards DesignerInitialize()爲您做了什麼? – JJS 2016-06-10 16:16:18

2

這裏是我的代碼

protected void btnExcel_Click(object sender, ImageClickEventArgs e) 
    { 
     if (gvDetail.Rows.Count > 0) 
     { 
      System.IO.StringWriter stringWrite1 = new System.IO.StringWriter(); 
      System.Web.UI.HtmlTextWriter htmlWrite1 = new HtmlTextWriter(stringWrite1); 
      gvDetail.RenderControl(htmlWrite1); 

      gvDetail.AllowPaging = false; 
      Search(); 
      sh.ExportToExcel(gvDetail, "Report"); 
     } 
    } 

    public override void VerifyRenderingInServerForm(Control control) 
    { 
     /* Confirms that an HtmlForm control is rendered for the specified ASP.NET 
      server control at run time. */ 
    } 
相關問題