0

電子メールを送信する複合カスタム コントロールがあります。メールはボタンクリックで送信されます。しかし、ボタンを 2 回クリックした後にメールが送信されます。なぜこれが起こっているのか、どうすれば解決できるのか誰か知っていますか? コードは次のとおりです。

namespace EmailControl
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:ServerControl1 runat=server></{0}:ServerControl1>")]
    public class ServerControl1 : WebControl,INamingContainer
    {
        public string Text
        {
            get { return ViewState["Text"] as string ?? "[" + this.ID + "]"; }
            set { ViewState["Text"] = value; }
        }

        public string Host
        {
            get { return ViewState["host"] as string ?? "[" + this.ID + "]"; }
            set { ViewState["host"] = value; }
        }

        public string From
        {
            get { return ViewState["from"] as string ?? "[" + this.ID + "]"; }
            set { ViewState["from"] = value; }
        }

        public int Port
        {
            get { return (int) ViewState["port"]; }
            set { ViewState["port"] = value; }
        }

        public string UserName
        {
            get { return ViewState["user"] as string ?? "[" + this.ID + "]"; }
            set { ViewState["user"] = value; }
        }

        public string Password
        {
            get { return ViewState["pass"] as string ?? "[" + this.ID + "]"; }
            set { ViewState["pass"] = value; }
        }

        TextBox txtEmail;
        TextBox txtBody;
        TextBox txtSubject;
        Button btnSend;

        protected override void CreateChildControls()
        {
            txtEmail = new TextBox();
            txtEmail.ID = "txtEmail";
            txtEmail.AutoPostBack = true;
            LiteralControl l1 = new LiteralControl("<br/>");
            txtSubject = new TextBox();
            txtSubject.ID = "txtSubject";
            txtEmail.AutoPostBack = true;
            this.Controls.Add(txtEmail);
            this.Controls.Add(txtSubject);
            LiteralControl l2= new LiteralControl("<br/>");
            txtBody = new TextBox();
            txtBody.ID = "txtBody";
            txtBody.AutoPostBack = true;
            txtBody.TextMode = TextBoxMode.MultiLine;
            txtBody.Width = 200;
            txtBody.Height = 200;
            this.Controls.Add(txtBody);
            btnSend = new Button();
            btnSend.ID = "btnSend";
            btnSend.Width = 100;
            btnSend.Text = "Send";
            btnSend.Click += new EventHandler(OnButtonClick);
            this.Controls.Add(btnSend);
        }

        protected void OnButtonClick(object sender,EventArgs e)
        {
            TextBox txtEmail = (TextBox)this.FindControl("txtEmail");
            MailMessage msg = new MailMessage(From,txtEmail.Text);
            TextBox txtSubject = (TextBox)this.FindControl("txtSubject");
            TextBox txtBody = (TextBox)this.FindControl("txtBody");
            msg.Subject = txtSubject.Text;
            msg.Body = txtBody.Text;

            SmtpClient smtp = new SmtpClient();
            smtp.Host = Host;
            smtp.Port = Convert.ToInt32(Port);
            smtp.EnableSsl = true;
            smtp.Credentials = new System.Net.NetworkCredential(UserName,
                Password);
            smtp.Send(msg);
        }
    }
}

aspx ページのコードは次のとおりです。

protected void Page_Load(object sender, EventArgs e)
{
    ServerControl11.Host = "smtp.gmail.com";
    ServerControl11.Port =25;
    ServerControl11.UserName = "*******************@gmail.com";
    ServerControl11.Password = "************";
    ServerControl11.From = "******************@gmail.com";
}
4

1 に答える 1

1

ボタンをクリックするたびにメールが送信されるということですか?その場合は、2 回目のポストバックを防止する必要があります。ここを参照してください:

繰り返しポストバックがビジネス層を混乱させないようにする方法

于 2012-08-05T12:58:12.187 に答える