Как отображать сообщение об ошибке только в OnFailure Ajax.BeginForm в MVC3?

У меня есть эта простая форма ajax в моем приложении MVC3, которая отправляет сообщение электронной почты:

@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" />
}

Если действию не удается отправить сообщение, оно создает исключение. Исключение обрабатывается и отображается в javascript-функции showError(error){}:

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

Проблема в следующем: error.responseText — это html-дамп всей страницы с ошибкой.

Мне нужно отобразить только сообщение об ошибке исключения (независимо от того, что находится в ex.Message в MVC3).

Реализация «public ActionResult SendMessage (строковое сообщение) {}» не имеет значения.

Мне нужно знать, как отображать сообщение об исключении только в обработчике javascript showError(error).

Огромное спасибо.

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

person monstro    schedule 18.04.2013    source источник
comment
пожалуйста, покажите действие SendMessage...   -  person Dave Alperovich    schedule 18.04.2013
comment
Не знаю, какое отношение это имеет к вопросу... 8|   -  person monstro    schedule 18.04.2013
comment
b/c вы не можете использовать onFailure, если не хотите перехватить ошибку http. Хотите понять, как вы возвращаете ошибку   -  person Dave Alperovich    schedule 18.04.2013


Ответы (3)


Вы не можете обрабатывать каждое исключение в методе OnFailure. Поскольку OnFailure вызывается, если статус ответа не находится в диапазоне 200. Таким образом, вы можете обрабатывать свой сценарий примерно так:

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

    }

Здесь, в этом коде, если почта отправлена ​​​​успешно, я вернул ответ «Успех», иначе я вернул фактическую ошибку, а в javascript я обработал этот ответ следующим образом:

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

Надеюсь, что это поможет вам.

person Jitender Kumar    schedule 02.05.2013

Чтобы решить эту проблему в своем собственном решении, я использовал класс HttpStatusCodeResult. Вот код, который у меня есть для справки:

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

// View
OnFailure = "alert(error);"

Это должно по-прежнему вызывать нормальное поведение ошибки на клиенте, включая вывод ошибки 500 в консоли браузера, и должно отлично работать со сценарием, который вы уже используете для отображения своей ошибки.

person mikeschuld    schedule 15.11.2016

Вы можете поймать свое исключение в контроллере и отправить обратно точное сообщение об ошибке. Что-то типа:

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

В этом случае вам может потребоваться изучить ответ и соответствующим образом обновить свой javascript showError.

person Floremin    schedule 18.04.2013
comment
Спасибо, но это ничем не отличается от того, что у меня было без try catch - он также возвращает html-дамп всей страницы с ошибкой. Не уверен, что параметр OnFailure помощника Ajax.BeginForm может обрабатывать исключение, просто получая только сообщение об ошибке. Похоже, это невозможно. Просто странно, как это должно работать, если вы всегда получаете HTML-дамп ошибки обратно от контроллера... Я не хочу специально использовать какие-либо блоки TRY/CATCH, я просто хочу распространять и выводить системное исключение как есть , а только сообщение об ошибке, а не html-контент. - person monstro; 19.04.2013