4

私はこのコードを持っています。

 public ActionResult Index()
 {
        ReceiptModel model = new ReceiptModel();

        try
        {
            model = new ReceiptModel(context);
        }
        catch (BussinessException bex)
        {
            ModelState.AddModelError("Index", bex.MessageToDisplay);
            return View("Index");
        }
        return View(model);
 }

BussinesException irがデータベースから返され、ユーザーに表示されます。すべてのコントローラーメソッドのtry-catchステートメントを指定する必要がありますが、これは少し面倒です。これらの例外を処理する簡単な方法はありますか?

PS他のすべての例外はで処理されますHandleExceptionAttribute

アップデート:

Floradu88アプローチを使用しました。だから今私はこのようなものを持っています。

public sealed class HandleBussinessExceptionAttribute : HandleErrorAttribute, IExceptionFilter
    {

        public override void OnException(ExceptionContext filterContext)
        {
            filterContext.Controller.TempData["UnhandledException"] = filterContext.Exception;
            filterContext.ExceptionHandled = true;

            ((Controller)filterContext.Controller).ModelState.AddModelError(
                 ((BussinessException)filterContext.Exception).Code.ToString(),
                 ((BussinessException)filterContext.Exception).MessageToDisplay
             );

            filterContext.Result = new ViewResult
            {
                ViewName = this.View,
                TempData = filterContext.Controller.TempData,
                ViewData = filterContext.Controller.ViewData,
            };


        }
    }

そしてコントローラーアクションに私は置きました

[HandleBussinessExceptionAttribute(Order = 2, ExceptionType = typeof(BussinessException), View = "Login")]

私も例外ハンドラーで試しました:

 filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(filterContext.RouteData));

次に、アクションのエラーを処理しますが、アクションのModelState.IsValid値はnullになります。だから今のところ私は最初のアプローチを使用します。もう少し時間があれば、2番目のアプローチを修正しようとします。

4

2 に答える 2

2

この部分のドキュメントをお読みください:http: //msdn.microsoft.com/en-us/library/gg416513%28v=vs.98%29.aspx
http://www.asp.net/web-api/overview / web-api-routing-and-actions / exception-handling
http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/understanding-action-filters-cs

ここに投稿するにはコンテンツが多すぎます:

 public class NotImplExceptionFilterAttribute : ExceptionFilterAttribute 
    {
        public override void OnException(HttpActionExecutedContext context)
        {
            if (context.Exception is NotImplementedException)
            {
                context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
            }
        }
    }

そしてあなたのコントローラー:

public class ProductsController : ApiController
{
    [NotImplExceptionFilter]
    public Contact GetContact(int id)
    {
        throw new NotImplementedException("This method is not implemented");
    }
}
于 2013-03-26T09:16:19.970 に答える
0
  1. この投稿によると、カスタムバインダーを作成し、モデルをTempDataに配置します。

    public class AppBinder : DefaultModelBinder
    {
        protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            base.OnModelUpdated(controllerContext, bindingContext);
            controllerContext.Controller.TempData["model"] =    bindingContext.Model;
        }
    }
    
  2. global.asaxに登録します。

    ModelBinders.Binders.DefaultBinder = new AppBinder();
    
  3. BaseControllerを作成し、OnExceptionをオーバーライドします。

    protected override void OnException(ExceptionContext filterContext)
    {
        filterContext.ExceptionHandled = true;
    
        this.ModelState.AddModelError(string.Empty, filterContext.Exception.Message);
    
        filterContext.Result = new ViewResult
        {
            ViewName = filterContext.RouteData.Values["action"].ToString(),
            TempData = filterContext.Controller.TempData,
            ViewData = filterContext.Controller.ViewData
        };
    
        base.OnException(filterContext);
    }
    

すべてのアクションintこのベースコントローラーから継承されたコントローラーは、夏季の検証で未処理の例外を独自のビューで表示します(

@Html.ValidationSummary(true) 

ページ内)。それは私のために働きます、希望はあなたのためにも働きます!

于 2015-04-19T14:14:30.520 に答える