如何在没有隐藏输入字段的情况下将值从javascript(innerhtml)传递到asp.net代码隐藏?

时间:2013-02-05 20:42:50

标签: javascript asp.net callback hidden-field mailmessage

我有一个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>

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

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

2 个答案:

答案 0 :(得分:2)

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

一个是发回回数据 - 这意味着你需要将它们添加到一个隐藏的或其他输入控件中,并通过post发送它们。

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

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

关于消息:

Request Validation: html code in an input field

这是一般用途的安全措施,在你的情况下,如果你知道你要在代码背后发送html代码,并且你知道如何控制它,简单禁用它并且不用担心 - 只要小心你要去做什么以后渲染。

来自MSDN Request Validation in ASP.NET

  

如果您希望应用程序接受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>

PopUp Page

<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"]);
}

答案 1 :(得分:0)

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

There is an excellent msdn article here详细解释了这个概念,但如果您使用Server.Transfer打开新页面,则可以说您可以访问上一页的控件。现在我认为我的麻烦在那里结束了,但显然Server.Transfer是古老的,并且以UpdatePanel处理回发的方式混乱。 Another brilliant article explaining problems and workarounds is here。我使用msdn article on PostBackTrigger来最终使我的代码工作。

最后,疯狂道具给阿里斯托斯,他坐下来帮我解决这个问题,所以我要把他的答案标记为正确的答案 - 因为我的另一个选择并不是我的问题的答案。这就是全部,伙计们!