私の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にあるものは何でも)。
「publicActionResultSendMessage(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("[email protected]");
mail.Subject = "Some Message";
mail.Body = message;
mail.To.Add("[email protected]");
SmtpServer.Send(mail);
return null;
}
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);
}
これがお役に立てば幸いです。
私自身のソリューションでこれを解決するために、HttpStatusCodeResultクラスを使用しました。これが私が参照用に持っているコードです:
try
{
// Some code that can error
}
catch (Exception e)
{
return new HttpStatusCodeResult(HttpStatusCode.InternalServerError, e.Message);
}
// View
OnFailure = "alert(error);"
これにより、ブラウザコンソールに500エラーを配置するなど、クライアントで通常のエラー動作がすべてトリガーされ、エラーを表示するためにすでに使用しているスクリプトで完全に機能するはずです。
コントローラで例外をキャッチし、正確なエラーメッセージを送り返すことができます。何かのようなもの:
[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
を更新する必要がある場合があります。