ASP.NET Web Forms Button后台btnSendMail_Click无引用导致点击失效
问题描述
ASP.NET Button的onclick点击行为无法生效,后台代码中btnSendMail_Click显示0引用,此前多次使用该方法都能正常运行,本次无法实现预期效果。
前端代码
<div class="col-lg-8" runat="server"> <div class="contact-form section-top-gap-100" data-aos="fade-up" data-aos-delay="200"> <asp:Label Text="<%$Resources:Lang, ContactUs %>" runat="server" Font-Size="Large" Font-Bold="true"></asp:Label> <div id="contact-form"> <div class="row"> <div class="col-lg-6"> <div class="default-form-box mb-20"> <asp:Label Text="<%$Resources:Lang, Name %>" runat="server" Font-Bold="true"></asp:Label> <input name="name" type="text" id="contactName" runat="server" placeholder="<%$Resources:Lang, NamePlaceHolder %>" > </div> </div> <div class="col-lg-6"> <div class="default-form-box mb-20"> <asp:Label Text="<%$Resources:Lang, mail %>" runat="server" Font-Bold="true"></asp:Label> <input name="email" type="email" id="contactEmail" runat="server" placeholder="<%$Resources:Lang, mailPlaceHolder %>" > </div> </div> <div class="col-lg-12"> <div class="default-form-box mb-20"> <asp:Label Text="<%$Resources:Lang, subject %>" runat="server" Font-Bold="true"></asp:Label> <input name="subject" type="text" id="contactSubject" runat="server" placeholder="<%$Resources:Lang, SubjectPlaceHolder %>"> </div> </div> <div class="col-lg-12"> <div class="default-form-box mb-20"> <asp:Label Text="<%$Resources:Lang, message %>" runat="server" Font-Bold="true"></asp:Label> <textarea name="message" id="contactMessage" cols="30" rows="10" runat="server" placeholder="<%$Resources:Lang, MessagePlaceHolder %>" ></textarea> </div> </div> <div class="col-lg-12"> <asp:Button runat="server" CssClass="contact-submit-btn" Text="<%$Resources:Lang, sendMessage %>" ID="btnSendMail" OnClick="btnSendMail_Click" UseSubmitBehavior="true"/> </div> <p class="form-messege"></p> </div> </div> </div> </div>
后台代码
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Mail; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace AsjSpray.Web.Pages { public partial class Iletisim : BasePage { #region Properties public static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endregion protected void Page_Load(object sender, EventArgs e) { Page.Title = "AsjSpray " + Resources.Lang.ContactUs; log.Info("İletişim Sayfasına girildi"); } private static string GetIp() { string VisitorsIPAddress = string.Empty; try { if (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null) { VisitorsIPAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); } else if (HttpContext.Current.Request.UserHostAddress.Length != 0) { VisitorsIPAddress = HttpContext.Current.Request.UserHostAddress; } } catch (Exception ex) { log.Error("Hata [Iletisim.GetIp()]" + ex.Message); } return VisitorsIPAddress; } bool IsValidEmail(string email) { try { var addr = new System.Net.Mail.MailAddress(email); return addr.Address == email; } catch { return false; } } protected void btnSendMail_Click(object sender, EventArgs e) { var senderMessage = contactMessage.Value; var senderName = contactName.Value; var senderMail = contactEmail.Value; var subject = contactSubject.Value; var ipAddress = GetIp(); SmtpClient smtpClient = new SmtpClient(); NetworkCredential basicCredential = new NetworkCredential("mail@test.com", "pass"); MailMessage message = new MailMessage(); MailAddress fromAddress = new MailAddress("mail@test.com"); smtpClient.Host = "mail.asjspray.com"; smtpClient.UseDefaultCredentials = false; smtpClient.Credentials = basicCredential; smtpClient.Port = 587; smtpClient.EnableSsl = true; message.From = fromAddress; message.Subject = subject; message.IsBodyHtml = true; message.Body = "Gönderici adı: " + senderName + "<br/> Gönderici maili: " + senderMail + "<br/> Gönderici mesajı: " + senderMessage + "<br/> Gönderici ip adresi: " + ipAddress; ; message.To.Add("fatihcayir2001@gmail.com"); message.Bcc.Add(""); try { ServicePointManager.ServerCertificateValidationCallback = delegate (object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; }; if (senderMessage != null && senderName != null && senderMail != null) { smtpClient.Send(message); ScriptManager.RegisterStartupScript(this, GetType(), "CallFunction", "successful();", true); log.Info("Mail gönderme başarılı mail adresi: " + senderMail); } else if (IsValidEmail(senderMail) == false) { ScriptManager.RegisterStartupScript(this, GetType(), "CallFunction", "emptyMail();", true); log.Warn("Mail gönderilmedi mail geçersiz " + senderMail); } else { ScriptManager.RegisterStartupScript(this, GetType(), "CallFunction", "hata();", true); log.Error("Mail gönderilmedi"); } } catch (Exception ex) { log.Error("Hata, Mail gönderilemedi " + ex.Message); Response.Write(ex.Message); Page.Response.Write("<script>console.log('" + ex.Message + "');</script>"); } } } }
错误现象
后台btnSendMail_Click方法显示0引用,点击按钮事件不触发。
解决方案
按优先级依次排查以下问题:
- 检查
.aspx页首的Page指令,确认Inherits属性值和后台类的完全限定名一致,即Inherits="AsjSpray.Web.Pages.Iletisim",同时CodeBehind属性指向的cs文件名正确。 - 确认
designer.cs文件中已经生成了btnSendMail控件的定义,若未生成可右键点击aspx页面选择「转换为Web应用程序」,或者手动在designer.cs中添加对应控件声明:protected global::System.Web.UI.WebControls.Button btnSendMail; - 检查页面是否包含前端表单验证逻辑拦截了按钮的提交行为,可临时移除页面上所有无关前端JS,测试按钮点击是否触发后台事件。
- 清理解决方案后重新生成项目,Visual Studio的静态引用计数有时会出现缓存错误,重新生成后确认引用计数是否更新。
- 确认按钮所在容器没有设置
OnClick事件冒泡阻断,也没有其他服务端控件的验证逻辑(如RequiredFieldValidator)未通过导致提交被拦截,可临时给按钮添加CausesValidation="false"属性测试。
内容的提问来源于stack exchange,提问作者fatihcayir2001
相关产品推荐
相关产品推荐

