【问题标题】:How to display error message only in OnFailure of Ajax.BeginForm in MVC3?如何仅在 MVC3 的 Ajax.BeginForm 的 OnFailure 中显示错误消息?
【发布时间】:2013-04-18 14:09:18
【问题描述】:

我的 MVC3 应用程序中有一个简单的 ajax 表单,用于发送电子邮件:

@using (Ajax.BeginForm("SendMessage", new AjaxOptions { 
    LoadingElementId = "wait", 
    OnSuccess = "loadMessages", 
    OnFailure = "showError" }))
{
    <input type="text" name="message" placeholder="Message" />
    <input type="submit" name="submit" value="Send" />
}

如果操作未能发送消息,则会引发异常。异常处理并显示在 showError(error){} javascript 函数中:

function showError(error) { 
    $("#error").text(error.responseText);
};

问题是:error.responseText是整个错误页面的html转储。

我只需要显示异常错误消息(MVC3 中的 ex.Message 中的任何内容)。

“public ActionResult SendMessage(string message) { }”的实现无关紧要。

我需要知道如何仅在 showError(error) javascript 处理程序中显示异常消息。

非常感谢。

    [HttpPost]
    public ActionResult SendMessage(string message)
    {
        MailMessage mail = new MailMessage();
        SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
        mail.From = new MailAddress("sender@gmail.com");
        mail.Subject = "Some Message";
        mail.Body = message;
        mail.To.Add("recepient@gmail.com");
        SmtpServer.Send(mail);
        return null;
    }

【问题讨论】:

  • 请显示您的 SendMessage 操作...
  • 不确定它与问题有什么关系... 8|
  • b/c 你不能使用 onFailure 除非你想捕获一个 http 错误。想了解你如何返回错误

标签: jquery asp.net-mvc-3 ajax.beginform


【解决方案1】:

您无法处理 OnFailure 方法中的每一个异常。因为如果响应状态不在 200 范围内,则会调用 OnFailure 。所以你可以像这样处理你的场景:

    [HttpPost]
    public ActionResult SendMessage(string message)
    {
        MailMessage mail = new MailMessage();
        ActionResult response = null;
        SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
        mail.From = new MailAddress("sender@gmail.com");
        mail.Subject = "Some Message";
        mail.Body = message;
        mail.To.Add("recepient@gmail.com");
        try
        {
            SmtpServer.Send(mail);
            response = Content("Success");
        }
        catch (Exception ex)
        {
            response = Content(ex.Message);
        }
        return response;

    }

如果邮件发送成功,则在此代码中,我返回响应“Success”,否则我返回实际错误,并且在 javascript 中我已像这样处理此响应:

    function loadMessages(error) {
    if (error == 'Success') {
        alert("Mail Sent successfully");
    }
    else {
        $("#error").text(error);
    }

希望这会对你有所帮助。

【讨论】:

    【解决方案2】:

    为了在我自己的解决方案中解决这个问题,我使用了 HttpStatusCodeResult 类。这是我的参考代码:

    try
    {
        // Some code that can error
    }
    catch (Exception e)
    {
        return new HttpStatusCodeResult(HttpStatusCode.InternalServerError, e.Message);
    }
    
    // View
    OnFailure = "alert(error);"
    

    这仍应触发客户端上的所有正常错误行为,包括在浏览器控制台中放置 500 错误,并且应与您已用于显示错误的脚本完美配合。

    【讨论】:

      【解决方案3】:

      您可以在控制器中捕获您的异常并返回准确的错误消息。比如:

      [HttpPost]
      public ActionResult SendMessage(string message)
      {
          try 
          {
              MailMessage mail = new MailMessage();
              SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
              mail.From = new MailAddress("sender@gmail.com");
              mail.Subject = "Some Message";
              mail.Body = message;
              mail.To.Add("recepient@gmail.com");
              SmtpServer.Send(mail);
              return null;
          } 
          catch (e)
          {
              throw new HttpException(500, e.Message);
          }
      }
      

      在这种情况下,您可能需要检查响应并相应地更新您的 javascript showError

      【讨论】:

      • 谢谢,但它与我没有 try catch 的情况没有什么不同 - 它还返回整个错误页面的 html 转储。不确定 Ajax.BeginForm 助手的 OnFailure 参数是否可以仅通过获取错误消息来处理异常。看起来是不可能的。只是奇怪,这应该如何工作,如果你总是从控制器返回错误的 html 转储......我不想故意有任何 TRY/CATCH 块,我只想传播和输出系统异常原样,但只有错误消息,而不是 html 内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多