【问题标题】:ASP.NET - Access final rendered HTML of FormView controlASP.NET - 访问 FormView 控件的最终呈现 HTML
【发布时间】:2014-08-18 20:52:03
【问题描述】:

我正在尝试使用单独的网页生成 HTML,该 HTML 可以通过 AJAX 返回到另一个网页以更新面板。但是,我找不到通过 Response.Write(...) 访问呈现的 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 的正确方法是什么?

【问题讨论】:

    标签: jquery html asp.net ajax formview


    【解决方案1】:

    我通过这个答案找到了一个简单的解决方案:

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

    基本上,当调用fvwWhseDetails.Rendercontrol(w); 时,我必须重写VerifyRederingInServerForm 方法以绕过对控件是否包含在&lt;form ... runat="server"&gt; 中的验证。

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

    我不完全理解绕过这两种保护措施的含义,但由于此页面仅用于返回这个单一的 FormView 控件,所以我现在将继续提出解决方案。如果有人有更合适的解决方案,请随时贡献,我会相应地更改我的答案。

    【讨论】:

      【解决方案2】:

      如果您将 FormView 包装在用户控件中,则可以定义一个 HttpHandler (myFormView.ashx),它可以仅加载该控件、呈现并使用生成的 HTML 进行响应。

      请参阅http://madskristensen.net/post/load-user-controls-from-an-httphandler-in-aspnet 以开始使用。

      【讨论】:

      • 我会试一试并报告,但简单地添加 FormView 控件的渲染 HTML 似乎增加了很多复杂性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多