Как отображать сообщение об ошибке только в 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" />
}
Если действие не позволяет отправить сообщение, оно выдает исключение. Исключение обрабатывается и отображается в функции showError (error) {} javascript:
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;
}
Ответы
Ответ 1
Вы не можете обрабатывать каждое исключение в методе 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);
}
Надеюсь, это поможет вам.
Ответ 2
Чтобы решить это в моем собственном решении, я использовал класс HttpStatusCodeResult. Вот код, который у меня есть для справки:
try
{
// Some code that can error
}
catch (Exception e)
{
return new HttpStatusCodeResult(HttpStatusCode.InternalServerError, e.Message);
}
// View
OnFailure = "alert(error);"
Это все равно должно вызвать все обычные ошибки на клиенте, в том числе положить 500 ошибок в консоли браузера, и должно отлично работать с script, который вы уже используете, чтобы показать свою ошибку.
Ответ 3
Вы можете поймать свое исключение в контроллере и отправить точное сообщение об ошибке. Что-то вроде:
[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
.