1

フォーム データを保存するためのアクション メソッド Save() があり、実行時に発生した例外をアラート タイプがエラーのアラート メッセージで表示したいと考えています。

エラー モデルと、エラーをリダイレクトしてレンダリングするための部分ビューも作成しました。

ただし、例外はアラート ボックスに表示されません。例外のすべてのタイプを表示する共通アクションを作成するにはどうすればよいですか? 誰か助けてください。

そして、ここに私のコードがあります:

Save アクションを呼び出す Jquert:

    $("#save-icon").click(function (event) {
         event.preventDefault();
         if ($('#Code').val() != '' && $('#Name').val() != '') {
             $.post('@Url.Action("Save")', $("#form1").serialize());
         }
     });

保存アクション:

    public override ActionResult Save()
    {
        try
        {
            ....
            regionClient.Save(ct);
            return Json(new { result = ct });
        }
        catch (Exception Ex)
        {
            return RedirectToAction("ShowError", new { ErrType="I", ErrMessage=Ex.Message });
        }
    }

ShowError アクション:

    public ActionResult ShowError(string ErrType,string ErrMessage)
    {
        Error Err = new Error(ErrType, ErrMessage);
        return PartialView(Err);
    }

エラー モデル:

public class Error { public string Type { get; 設定; } 公開文字列メッセージ { get; 設定; }

    public Error(string ErrType, string ErrMessage)
    {
        Type = ErrType;
        Message = ErrMessage;
    }
}

部分的なビュー:

@model iBoxV5.Models.Error
@section Scripts
{
    $(document).ready(function() {
      var message='@Model.Message';
      alert("Error:"+message);
    });
}

前もって感謝します..ハッピーコーディング!

4

2 に答える 2

0

ajax呼び出しで何らかの例外が発生した場合、アラートボックスにエラーを表示したいと思います。私が正しければ、これに従うことができます。

ASP.NET MVC の組み込みのエラー処理メカニズムは、Error通常の要求と AJAX 要求で何らかの例外が発生した場合は常に、共有フォルダーにあるエラー ビュー ( ) を返します。ビューにはError例外も表示されず、プレーンテキストが表示されるだけです。ビューにエラーを表示したい場合は、エラーをユーザーに直接表示するErrorことはお勧めできませんが、次のようにすることができます。

共有/Error.cshtml

@model System.Web.Mvc.HandleErrorInfo

<h2>Exception details</h2>
<p>
    Controller: @Model.ControllerName <br>
    Action: @Model.ActionName
    Exception: @Model.Exception
</p>

ビューに例外メッセージを表示するには、モデルにErrorビューを厳密に入力する必要があります。HandleErrorInfo

ビューを返す代わりに ajax 呼び出しに戻るときは、エラーの詳細を含むオブジェクトErrorを返すことをお勧めします。JSONそのためには、custom handle error filter以下で説明するように を作成する必要があります。

public class CustomHandleErrorAttribute : HandleErrorAttribute
{
    private readonly ILog _logger;
 
    public CustomHandleErrorAttribute()
    {
        _logger = LogManager.GetLogger("MyLogger");
    }
 
    public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
        {
            return;
        }
 
        if (new HttpException(null, filterContext.Exception).GetHttpCode() != 500)
        {
            return;
        }
 
        if (!ExceptionType.IsInstanceOfType(filterContext.Exception))
        {
            return;
        }
 
        // if the request is AJAX return JSON else view.
        if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
        {
            filterContext.Result = new JsonResult 
            { 
                JsonRequestBehavior = JsonRequestBehavior.AllowGet, 
                Data = new
                { 
                    error = true,
                    message = filterContext.Exception.Message
                } 
            };
        }
        else
        {
            var controllerName = (string)filterContext.RouteData.Values["controller"];
            var actionName = (string)filterContext.RouteData.Values["action"];
            var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
             
            filterContext.Result = new ViewResult
            {
                ViewName = View,
                MasterName = Master,
                ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
                TempData = filterContext.Controller.TempData
            };
        }
 
        // log the error using log4net.
        _logger.Error(filterContext.Exception.Message, filterContext.Exception);
 
        filterContext.ExceptionHandled = true;
        filterContext.HttpContext.Response.Clear();
        filterContext.HttpContext.Response.StatusCode = 500;
 
        filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;      
    }
}

HandleErrorAttributeに登録されている を に置き換える必要がGlobal.asax.csありCustomHandleErrorAttribute、これで完了です。これで、AJAX 呼び出しで例外が発生した場合に、例外の詳細を含む JSON オブジェクトを取得できます。

例外処理の詳細については、この投稿を参照してください。

于 2012-06-23T12:39:37.990 に答える
0

$.postAJAXリクエストであるため、この方法では実行できません。エラーメッセージを返す必要があります。たとえば、次のJSON形式でエラーメッセージを返し、 $.post.

$("#save-icon").click(function (event) {
     event.preventDefault();
     if ($('#Code').val() != '' && $('#Name').val() != '') {
         $.post('@Url.Action("Save")', $("#form1").serialize(), function(data) {
             if(data.type == 'error') {
                 alert(data.result);
             }
         });
     }
 });

アクション メソッドは次のようになります。

public override ActionResult Save()
{
    try
    {
        // ....
        regionClient.Save(ct);
        return Json(new { type="success", result = ct });
    }
    catch (Exception e)
    {
        return Json(new { type="error", result = e.Message });
    }
}
于 2012-06-23T09:48:23.837 に答える