4

我正在尝试在操作中发送电子邮件。但是,该操作总是返回一个空白屏幕。

看法:

<% using(Html.BeginForm("Sendlink", "Home")) %>
    <% { %>
     <input type="text" id="toemail" value="" />
        <input type="submit" value="Send" />
    <% } %>

控制器:

public ActionResult Sendlink()
{
    return View();
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Sendlink(FormCollection formCollection)
{
    try
    {
        string message = Session["link"].ToString();
        string toemail = formCollection["toemail"];
        MailEngine.Send("mail@mail.com", toemail, "link", message);
        return RedirectToAction("CanvasShare");
    }
    catch
    {

    }
    return null;
}

邮件引擎类:

public static void Send(string from, string to, string subject, string body)
{
    try
    {
        MailMessage mail = new MailMessage(from, to, subject, body);
        SmtpClient client = new SmtpClient("smtp.mymail.com");
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.EnableSsl = false;
        client.Send(mail);
    }
    catch
    {

    }
}
4

2 回答 2

3

您在应用程序中使用了空的 catch 块。这确实不是一个好主意,要对此进行更深入的讨论,请参阅Why are empty catch blocks a bad idea?及相关问题。

您似乎正在发生以下情况:

  • 在您的方法try块内的某处引发异常。Sendlink(FormCollection formCollection)此异常似乎源于RedirectToAction("CanvasShare")调用,因为该try块内的所有其他调用都不会生成异常。(特别是因为您抑制了该方法引发的异常MailEngine.Send。)
  • 你的空catchSendlink(FormCollection formCollection)被调用。这是您应该生成错误消息并将其显示给用户的地方。但是,您已决定将其留空,因此没有人知道出了什么问题以及发生了什么。
  • 控制流到达您方法中的return null;语句。Sendlink(FormCollection formCollection)我的猜测是你把它放在那里是因为编译器抱怨缺少返回值。现在返回此 null 并导致呈现一个空视图。

显而易见的解决方法是检查RedirectToAction并找出它引发异常的原因。此异常可能表明您的代码或应用程序存在问题,您需要采取措施防止它发生。

下一个修复是在您的应用程序中实际实现错误处理。删除所有空catch块并考虑是否要抛出异常或者是否要立即处理它。然而,忽略它几乎不是一个好主意。

为了说明您的应用程序中的问题:如果RedirectToAction没有抛出异常,您的电子邮件发送可能仍然失败。但是,您的 UI 没有任何方法可以发现出现问题,因为您忽略了MailClient.Send方法中的异常。如果您将其交付到生产环境,电子邮件发送将无声无息地失败,您的客户会想知道为什么他们从未收到过电子邮件。然后,您将很难找出实际问题是什么以及它发生在哪里。

于 2013-06-21T06:58:15.343 回答
2

toemail将始终为空。

您需要将nameinput 的属性设置为:"toemail"以使其可绑定。

<input type="text" id="toemail" name="toemail"  />

尽管如此,正如其他人所说,使用空的 catch 语句确实不是一个好主意。它隐藏了一个潜在的错误。与您的情况一样,块中有一个隐藏的异常try catch导致空操作结果,因此出现了空白屏幕。

有几个选项,如何在 ASP MVC 中处理异常。我最喜欢的是异常过滤器和<CustomErrors mode="On"/>web.config 设置的组合。

protected override void OnException(ExceptionContext filterContext)
{
    base.OnException(filterContext);

    if (filterContext.HttpContext.IsCustomErrorEnabled)
    {
        if (filterContext.Exception is SecurityException)
        {
            filterContext.ExceptionHandled = true;
            filterContext.Result = View("FriendlyError");
            //log the exception etc...
        }
    }
}

因此,当启用自定义错误时,您可以在生产中返回友好的错误屏幕,或者在调试时禁用它以查看实际异常。

于 2013-06-21T07:00:10.753 回答