2014-06-27 48 views
2

我想使用一个单独的网页来生成HTML,可以通过AJAX返回到另一个网页来更新面板。但是,我无法找到访问呈现的HTML以通过Response.Write(...)返回的方法。ASP.NET - 访问FormView控件的最终呈现HTML

我的网页代码如下:页面加载

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

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="frmMain" runat="server"> 
     <div id="content" runat="server"> 
     <asp:FormView ID="fvwWhseDetails" runat="server" AllowPaging="false" RenderOuterTable="false"> 
      <ItemTemplate> 
       <div class="col-md-8"><asp:TextBox ID="txtItemNum" runat="server" CssClass="form-control" Text='<%# Eval("OrderCode") %>' disabled/></div> 
       .... 
       .... 
       .... 
      </ItemTemplate> 
     </asp:FormView> 
     </div> 
    </form> 
</body> 
</html> 

后,它呈现HTML类似以下内容:

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head><title> 

</title></head> 
<body> 
    <form method="post" action="WarehouseDetails.aspx" id="frmMain"> 
     <div id="content"> 
      <div class="col-md-8"><input name="fvwWhseDetails$txtItemNum" type="text" value="159580" id="fvwWhseDetails_txtItemNum" class="form-control" disabled="" /></div> 
      .... 
      .... 
      .... 
     </div> 
    </form> 
</body> 
</html> 

我试图做到的是返回所有的呈现HTML包含...区域。然而,我没有尝试过似乎工作。

在我的代码隐藏文件,我已经尝试了HTML检索与评价每种方法低于各自的错误以下方法:

public partial class WarehouseDetails : System.Web.UI.Page 
{ 
    protected string strORAConnectionString = ConfigurationManager.ConnectionStrings["OraConnectionString"].ConnectionString; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     string strSelect = @"..."; 

     using (OleDbConnection oraHQDB = new OleDbConnection(strORAConnectionString)) 
     { 

      OleDbCommand command = new OleDbCommand(strSelect, oraHQDB); 
      oraHQDB.Open(); 

      OleDbDataReader reader = command.ExecuteReader(); 
      if(reader.HasRows) 
      { 
       fvwWhseDetails.DataSource = reader; 
       fvwWhseDetails.DataBind(); 

       // Everything up until this point works fine. 
       // If the code below is excluded, 
       // the page renders correctly. 

       string resp; 

       // Method 1 - try to access InnerHTML of <div id="content">...</div> 
       System.Web.UI.HtmlControls.HtmlGenericControl div = (System.Web.UI.HtmlControls.HtmlGenericControl)frmMain.FindControl("content"); 
       string resp = div.InnerHtml; 
       // Error generated: 
       // System.Web.HttpException: 
       // Cannot get inner content because the contents are not literal. 

       // Method 2 - try to use RenderControl() 
       StringWriter sw = new StringWriter(); 
       HtmlTextWriter w = new HtmlTextWriter(sw); 
       frmMain.RenderControl(w); 
       fvwWhseDetails.RenderControl(w); 
       fvwWhseDetails.Row.RenderControl(w);      
       div.RenderControl(w); 
       resp = sw.GetStringBuilder().ToString(); 
       // Error generated: 
       // System.Web.HttpException: 
       // Control '[control]' of type '[type]' must be placed inside a form tag with runat=server. 

       Response.Write(resp); 
      } 
      else 
      { 
       Response.Write("No results found."); 
      } 
      Response.End(); 
      reader.Close(); 
     } 
    } 
} 

我已经多次搜查,并试图在包装各种容器的内容和服务器控件,但不管我总是最终返回上面列出的两个错误之一。

在FormView中访问完整呈现的HTML的正确方法是什么?

回答

1

我发现了一个简单的解决方案是什么,我通过这个答案在寻找:

https://stackoverflow.com/a/17058409/363892

基本上我不得不重写VerifyRederingInServerForm方法,控制被包含在<form ... runat="server">内绕过验证调用fvwWhseDetails.Rendercontrol(w);当。

此外,我必须通过在页面上设置<%@ Page ............ EnableEventValidation="false" %>来禁用事件验证,以允许FormView控件独立呈现。

我不完全理解绕过这两种保护措施的影响,但由于此页面仅用于返回此单个FormView控件,因此我现在将继续解决此问题。如果有人有更合适的解决方案,请随时参与,我会相应地更改我的答案。

0

如果将用户控件中的FormView包装起来,可以定义一个HttpHandler(myFormView.ashx),它可以只加载该控件,呈现并响应生成的HTML。

请参阅http://madskristensen.net/post/load-user-controls-from-an-httphandler-in-aspnet让自己开始。

+0

我会给出一个镜头并报告回来,但它看起来像增加了一些额外的复杂性,只需额外提供一个FormView控件的HTML。 –