我正在尝试在动作中发送电子邮件。但是,操作始终返回空白屏幕。
查看:
<% 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;
}
Class MailEngine:
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
{
}
}
答案 0 :(得分:3)
您在应用程序中使用空catch块。这不是一个好主意,有关此问题的更深入讨论,请参阅Why are empty catch blocks a bad idea?及相关问题。
您似乎正在发生的事情如下:
try
方法的Sendlink(FormCollection formCollection)
块内某处抛出异常。此异常似乎源于RedirectToAction("CanvasShare")
调用,因为try
块内的所有其他调用都不会生成异常。 (特别是因为您抑制了MailEngine.Send
方法抛出的异常。)catch
中的空Sendlink(FormCollection formCollection)
块。这是您应该生成错误消息并将其显示给用户的位置。但是,你已经决定将它留空,所以没有人知道出了什么问题以及它是什么。return null;
方法中的Sendlink(FormCollection formCollection)
语句。我的猜测是你把它放在那里因为编译器抱怨缺少返回值。现在返回此null并导致呈现空视图。明显的解决方法是检查RedirectToAction
并找出它抛出异常的原因。此异常可能表示您的代码或应用中存在问题,您需要采取措施防止其发生。
下一个修复是在您的应用程序中实际实现错误处理。删除所有空的catch
块,并考虑是否要抛出异常,或者是否要立即处理它。然而,忽略它几乎不是一个好主意。
说明您的应用中的问题:如果未引发RedirectToAction
中的异常,您的电子邮件发送可能仍会失败。但是,您的UI无法找到出错的原因,因为您在MailClient.Send
方法中忽略了异常。如果您将其发送到生产中,电子邮件发送将无声地失败,您的客户会想知道为什么他们从未收到过电子邮件。那么你很难找出实际问题是什么以及它发生在哪里。
答案 1 :(得分:2)
toemail
将始终为空。
您需要将输入的name
属性设置为:"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...
}
}
}
因此,当启用自定义错误时,您可以在生产时返回友好的错误屏幕,或者在调试时禁用它以查看实际的异常。