ASP.NET MVC中Controller与JS通信异常 邮件发送提示不显示
问题根源
你现在的代码有三个核心问题,导致提示无法正常展示:
- AJAX回调参数顺序完全写反:jQuery的
$.ajaxsuccess回调三个参数固定顺序是(后端返回数据data, 状态字符串textStatus, jqXHR实例),你代码里把第二个参数命名为jqXHR、第三个命名为textStatus,实际你写的textStatus只是值为"success"的字符串,根本不存在.status、.statusText属性,自然读不到你设置的"Sent Successfully"文本。 - 后端缺失核心发送逻辑:你SmtpClient代码块里只写了
//EMAIL CODE的注释,没有调用smtp.Send(mm)执行实际的邮件发送操作,就算前端逻辑对,邮件也发不出去。 - error回调存在未定义变量:错误回调里你打印日志用了
data变量,但这个变量没有在error回调的参数列表里定义,会直接抛出JS异常,打断后续弹窗渲染逻辑。
另外你用HttpStatusCodeResult返回500错误时,IIS默认会拦截非200响应,把你自定义的错误提示替换成默认的服务器错误文本,就算前端参数写对也拿不到自定义消息。
修复方案
1. 调整后端返回逻辑
不要靠HTTP状态码传业务提示,统一返回200状态的JSON结构,兼容性最好,同时补上缺失的邮件发送代码:
public ActionResult SendForm(string message) { try { // 读取Web.config的SMTP配置 SmtpSection smtpSection = (SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp"); using (MailMessage mm = new MailMessage("发件人邮箱地址", "收件人邮箱地址")) { mm.Subject = "你的邮件主题"; mm.Body = message; mm.IsBodyHtml = true; using (SmtpClient smtp = new SmtpClient()) { smtp.Send(mm); // 补上之前缺失的发送调用 } } return Json(new { success = true, msg = "邮件发送成功" }); } catch (SmtpException) { return Json(new { success = false, msg = "邮件发送过程中出现错误" }); } catch (Exception) { return Json(new { success = false, msg = "请求处理发生异常" }); } }
2. 修正前端AJAX代码
直接读取后端返回JSON里的提示字段,修正参数和变量错误:
$.ajax({ method: 'POST', cache: false, contentType: 'application/json', url: '@Url.Action("SendForm", "Index")', data: JSON.stringify(data), success: function (res) { clearAlertModal(); if (res.success) { form.find('textarea').val(''); } modal.find('div.special-alert').html(res.msg); modal.modal('show'); }, error: function (jqXHR, textStatus, errorThrown) { clearAlertModal(); console.log('请求异常:', textStatus, errorThrown); modal.find('div.special-alert').html('网络请求失败,请稍后重试'); modal.modal('show'); } });
如果你一定要用读取
statusText的方式实现,首先要把success回调的参数顺序改对,自定义提示文本存在第三个参数(jqXHR实例)的statusText属性上;其次要在web.config里加配置关闭IIS的自定义错误拦截,否则500响应的自定义提示会被替换,维护成本远高于返回JSON结构的方案。
内容的提问来源于stack exchange,提问作者Rekcs
相关产品推荐
相关产品推荐

