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

如何在没有隐藏输入字段的情况下将值从javascript(innerhtml)传递到asp.net codebehind?,javascript,asp.net,callback,hidden-field,mailmessage,Javascript,Asp.net,Callback,Hidden Field,Mailmessage,我有一个aspx页面(主页),我用它来填充另一个aspx页面(弹出窗口)上的一些div,然后使用window.loaded事件单击按钮。代码如下: mainpage.aspx上的脚本 <script type="text/javascript"> window.callback = function (doc) { if (document.getElementById('GridView2') != null) {

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

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

window.callback=函数(doc){
if(document.getElementById('GridView2')!=null)
{
//获取Gridview HTML并用标记将其包装
var temp=document.getElementById('GridView2').innerHTML;
var temp2=”“+temp+”;
doc.getElementById('foo')。innerHTML=temp2;//这很好用
}
其他的
{
//缺少GridView,请不要执行任何操作!
}
}
函数openWindow(){
//仅当存在Gridview时才打开新的撰写电子邮件窗口
if((document.getElementById('GridView2')!=null)){
var mywindow=window.open(“Popup.aspx”);
}
否则{
警报(“请先创建GridView”);
}
}

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>

函数加载(){
window.opener.callback(文档);
alert(document.getElementById('foo').innerHTML);//这会提醒我需要的代码
//var输入=document.createElement(“输入”);
//setAttribute(“类型”、“隐藏”);
//setAttribute(“名称”、“测试输入”);
//setAttribute(“runat”、“server”);
//input.setAttribute(“value”,document.getElementById(“foo”).innerHTML);
////附加到所需的表单元素。
//document.getElementById(“foo2”).appendChild(输入);
}
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)
    {

    }
}
受保护的无效发送\u电子邮件\u按钮\u单击(对象发件人,事件参数e)
{
string subject=string.Format(“测试电子邮件”);
字符串mailto=”me@mysite.com";
字符串mailfrom=Environment.UserName+“@mysite.com”;
字符串mailBody=“测试”;
MailMessage mail=新的MailMessage(mailfrom、mailto、subject、null);
mail.IsBodyHtml=true;
mail.Body=mailBody;
SmtpClient SmtpClient=新的SmtpClient(“smtphost”);
smtpClient.Credentials=CredentialCache.DefaultNetworkCredentials;
尝试
{
发送(邮件);
}
捕获(例外情况除外)
{
}
}
现在,我一直在尝试将div.innerhtml的值传递给codebehind,这样我就可以用这个HTML标记创建一封电子邮件。我尝试使用一个隐藏的div,但在请求验证方面遇到了一个asp.net错误:输入字段中有html代码,这是一个公平的观点。我似乎无法访问div.InnerHtml。我得到值“\r\n\r\n”。我有我需要的值,但它是用Javascript编写的,我只需要一种方法将这个值传递到C,这样我就可以发送电子邮件了


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

要向代码隐藏发送一些数据,您有两种方法。PostGet

一种是用post-back发送数据,这意味着您需要将它们添加到一个隐藏的或其他用post发送数据的输入控件中

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

这两种方法都可以用于ajax调用。因此,选择一个并将数据发送到代码隐藏

关于信息:

Request Validation: html code in an input field
这是一般用途的安全措施,在您的情况下,如果您知道要在代码背后发送html代码,并且您知道如何控制它,请简单地禁用它,不要担心-只是小心以后要呈现的内容

从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>

因此,在为此伤了半天脑筋之后,我终于开始使用代码隐藏来处理客户机和服务器脚本。我从未听说过Server.Transfer和Page.PreviousPage,所以它很适合我,但事实证明它正是我所需要的

这就详细地解释了这个概念,但只需说,如果使用Server.Transfer打开新页面,就可以访问上一页的控件。现在我想我的麻烦到此为止了,但很明显,服务器传输已经过时了,并且破坏了UpdatePanel处理回发的方式。我使用了这个方法,终于让我的代码开始工作了


最后,作为亚里士多德的疯狂道具,他坐下来帮我解决了这个问题,所以我要把他的答案标记为正确的答案——因为我的答案是另一个答案,而不是我问题的答案。就这些,伙计们

除非在页面声明中关闭页面上的请求验证,否则如果不清理html,我认为这是不可能的。我想我将尝试将html的编码版本作为POST参数发送,看看这是否有效。我怀疑请求验证可能被“愚弄”了。例如,使用JSON编码数据并替换
@pst实际上数据可能是危险的(注入代码),如果在代码后面获得数据后,在页面上再次呈现它们。因此,你必须小心避免这种情况——而不是在你把它们送回去的时候。另一方面,当你将它们添加到输入控件上时,你需要用javascript对它们进行html编码,否则你可能会破坏回发数据。再多的验证也不能真正防止不安全的编码。不应将任意原始文本写入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"]);
}