1

window.loaded イベントを使用してボタンをクリックすると、別の aspx ページ (ポップアップ) にいくつかの div を設定するために使用する aspx ページ (メインページ) があります。コードは以下のとおりです。

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 を使用してみましたが、Request Validation: html code in an input フィールドに関する asp.net エラーが発生しました。これは公正なポイントです。div.InnerHtml にアクセスできないようです。「\r\n\r\n」という値を取得します。私は必要な値を持っていますが、それは Javascript です。メールを送信できるように、この値を C# に取得する方法が必要です。

[SendEmail] ボタンをクリックすると、再びアラートが表示されます (window.loaded が呼び出されているため)。ボタンがクリックされるたびにではなく、Popup.aspx が 1 回だけ読み込まれるようにするにはどうすればよいですか? そして、SendEmail を機能させるために innerhtml 値を渡す方法は? ご覧いただきありがとうございます。

4

2 に答える 2

2

コード ビハインドにデータを送信するには、2 つの方法があります。PostGet。_

1 つは、ポストバックでデータを送信することです。つまり、ポストでデータを送信する非表示またはその他の入力コントロール内にデータを追加する必要があります。

もう 1 つは、それらをパラメーターとして URL に追加することです。

このメソッドはどちらも ajax 呼び出しで使用できます。1 つを選択して、データをコード ビハインドに送信します。

メッセージについて:

Request Validation: html code in an input field

これは一般的な目的のセキュリティ対策です。コードビハインドでhtmlコードを送信することがわかっていて、それを制御する方法を知っている場合は、単純に無効にして心配しないでください。後でレンダリングするものに注意してください.

ASP.NET でのMSDN Request Validationから:

アプリケーションで 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 の記事を使用して、最終的にコードを機能させました。

そして最後に、アリストスへの狂った小道具、彼は座って私を助けてくれたので、私は彼の答えを正しい答えとしてマークするつもりです. 以上です、皆さん!

于 2013-02-06T04:11:08.047 に答える