1

我有一个 aspx 页面(主页),我使用 window.loaded 事件在按钮单击时填充另一个 aspx 页面(弹出)上的一些 div。代码如下:

mainpage.aspx 上的脚本

  <script type="text/javascript">

      window.callback = function (doc) {

          if (document.getElementById('GridView2') != null)
          {
              // Get Gridview HTML and wrap it with <table> tag
              var temp = document.getElementById('GridView2').innerHTML;
              var temp2 = "<table>" + temp + "</table>";

              doc.getElementById('foo').innerHTML = temp2; // this works fine
          }
          else
          {
              // GridView is missing, do nothing!
          }
      }

      function openWindow() {

          // Only open a new Compose Email window if there is a Gridview present
          if ((document.getElementById('GridView2') != null)) {
              var mywindow = window.open("Popup.aspx");
          }
          else {
              alert("Please create GridView first");
          }
      }

Popup.aspx 上的代码

    <script type="text/javascript">
    function loaded() {
        window.opener.callback(document);
        alert(document.getElementById('foo').innerHTML); //This alerts the code I need

        //var input = document.createElement("input");
        //input.setAttribute("type", "hidden");
        //input.setAttribute("name", "testinput");
        //input.setAttribute("runat", "server");
        //input.setAttribute("value", document.getElementById('foo').innerHTML);

        ////append to form element that you want .
        //document.getElementById("foo2").appendChild(input);
    }
</script>

<asp:Button OnClick="Send_Email_Button_Click" ID="SendEmail" Text="Send Email" CssClass="Button1" runat="server" />
            <div id="foo" runat="server">

            </div>

弹出窗口.aspx.cs

protected void Send_Email_Button_Click(object sender, EventArgs e)
{
    string subject = String.Format("TEST EMAIL");
    string mailto = "me@mysite.com";
    string mailfrom = Environment.UserName + "@mysite.com";
    string mailBody = "<h1>Testing</h1>";

    MailMessage mail = new MailMessage(mailfrom, mailto, subject, null);
    mail.IsBodyHtml = true;
    mail.Body = mailBody;
    SmtpClient smtpClient = new SmtpClient("smtphost");
    smtpClient.Credentials = CredentialCache.DefaultNetworkCredentials;
    try
    {
        smtpClient.Send(mail);
    }
    catch (Exception ex)
    {

    }
}

现在,我一直在尝试将 div.innerhtml 的值传递给代码隐藏,因此我可以使用此 HTML 标记创建电子邮件。我尝试使用隐藏的 div,但我得到了一个关于请求验证的 asp.net 错误:输入字段中的 html 代码,这是一个公平的观点。我似乎无法访问 div.InnerHtml。我得到值“\r\n\r\n”。我有我需要的值,但它是在 Javascript 中的,我只需要一种将这个值传递给 C# 的方法,这样我就可以发送电子邮件了。

当我单击 SendEmail 按钮时,我再次收到警报(因为正在调用 window.loaded)。如何使 Popup.aspx 仅填充一次,而不是在每次单击按钮时填充?以及如何传递 innerhtml 值以使 SendEmail 工作?非常感谢您的关注。

4

2 回答 2

2

要将一些数据发送到后面的代码,有两种方法。邮政获取。_

一种是通过回传发送数据 - 这意味着您需要将它们添加到隐藏或其他输入控件中,以便通过 post 发送它们。

另一种是将它们作为参数添加到 url。

这两种方法都可以与 ajax 调用一起使用。所以选择一个并将您的数据发送到后面的代码。

关于留言:

Request Validation: html code in an input field

这是一般用途的安全措施,在您的情况下,如果您知道要在代码后面发送 html 代码,并且您知道如何控制它,简单地禁用它并且不用担心 - 请注意稍后要渲染的内容.

来自 ASP.NET 中的 MSDN请求验证

如果您希望您的应用程序接受 HTML 标记,这可能是个问题。例如,如果您的网站允许用户添加评论,您可能希望让用户使用 HTML 标记执行基本格式设置,这些标记将文本以粗体或斜体显示。在这种情况下,您可以禁用请求验证并手动检查恶意内容,或者您​​可以自定义请求验证以便接受某些类型的标记或脚本

更新

有效的示例代码:主页

<head runat="server">
    <title></title>

    <script type="text/javascript">
      window.callback = function (doc) {
            doc.getElementById('SendBack').value = escape("<b>send me back</b>"); 
      }

      function openWindow() {
            var mywindow = window.open("Page2PopUp.aspx");          
      }
    </script>

</head>
<body>
    <form id="form1" runat="server">
        <a href="#" onclick="openWindow();return false">open pop up</a>
    </form>
</body>
</html>

弹出页面

<head runat="server">
    <title></title>
   <script type="text/javascript">
    function GetDataBack() {
        window.opener.callback(document);
    }
</script>
</head>
<body >
    <form id="form1" runat="server">
    <div>
        <input id="SendBack" name="SendBack" value="" type="hidden" />    
        <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" OnClientClick="GetDataBack()" />    
        <asp:Literal runat="server" ID="txtDebugCode"></asp:Literal>    
    </div>
    </form>
</body>
</html>

并阅读:

protected void Button1_Click(object sender, EventArgs e)
{
    txtDebugCode.Text = Server.UrlDecode(Request.Form["SendBack"]);
}
于 2013-02-05T20:53:37.470 回答
0

因此,经过半天的努力,我终于通过仅使用代码隐藏来处理客户端和服务器脚本。我从未听说过 Server.Transfer 和 Page.PreviousPage,所以它对我很有帮助,但事实证明它正是我所需要的。

这里有一篇很棒的 msdn 文章详细解释了这个概念,但只要你使用 Server.Transfer 打开新页面就可以访问上一个页面的控件就足够了。现在我认为我的麻烦到此为止了,但显然 Server.Transfer 是古老的,并且与 UpdatePanel 处理回发的方式相混淆。另一篇解释问题和解决方法的精彩文章在这里。我使用PostBackTrigger 上的 msdn 文章最终让我的代码正常工作。

And finally, mad props to Aristos, he sat and helped me through this, so I'm going to mark his answer as the right answer--since mine's an alternative and not the answer to my question. That's all, folks!

于 2013-02-06T04:11:08.047 回答