تعامل مع الأخطاء باستخدام ErrorController بدلاً من العرض المباشر

StackOverflow https://stackoverflow.com/questions/197414

سؤال

أحاول أن أتعرف على معالجة الأخطاء في MVC.ما أبحث عنه هو طريقة مركزية لاكتشاف الأخطاء وتسجيلها وحلها إن أمكن، وإذا لزم الأمر، اتخذ إجراءات أخرى وأخيرًا أظهر العرض الصحيح للمستخدم.

أعتقد أنه يمكنني استخدام مرشح [HandleError] لهذا الغرض، ولكن لا أرى أي طريقة لتوجيهه إلى وحدة التحكم/الإجراء.الخيار الوحيد الذي أراه هو توجيهه مباشرة إلى العرض.

هل كانت مفيدة؟

المحلول

HandleErrorAttribute التي تأتي مع MVC هو جميلة IExceptionFilter الأساسية.

لديك عدد قليل من الخيارات لتحقيق ما أعتقد ش تريد.

ويمكنك إما استخدام [HandleError (نوع = تشير typeof (MyException)، عرض = "ErrorView")] بشأن الإجراءات / تحكم أو تنفيذ بنفسك

HandleErrorAttribute ] ليس معقدة للغاية. أعتقد أن توصي MS نسخ هذا الرمز وتعديل لتلائم الاحتياجات الخاصة بك.

ووتجاوز OnException يتيح لك الوصول إلى جميع تلك المعلومات قد تحتاج - تحكم، والعمل، وبيانات الطريق، وما إلى ذلك - من خلال ExceptionContext

وتذكر أن تعيين ExceptionHandled. ثم يمكنك تعيين filterContext.Result إلى مثيل RedirectToAction الجديد الذي توجيه لErrorController والعمل الخاص بك - من الواضح أنك يمكن أن يعرض وحدة تحكم وإجراءات محددة مع خصائص

نصائح أخرى

وLeppi، معهد التمويل الدولي الذي تريد إرساله إلى نتائج العمل، يمكنك تحديد عمل وحدة تحكم لإعادة توجيه على خطأ. انها مثال جيد، ولكن أنا لا personaly مثل أي صفحات استخدام العرف أو رموز المتشعب لرموز

وهنا ومثال على بلدي IExtenptionFilter. بلدي قاعدة كونترولر لديها الافتراضي IExceptionFilter لمعالجة كافة الأخطاء لا تسيطر عليها.

[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes",
    Justification = "This attribute is AllowMultiple = true and users might want to override behavior.")]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class GenericExceptionHandlerFilter : ActionFilterAttribute, IExceptionFilter
{

    public Type ExceptionType { get; set;}
    public string RedirectToAction { get; set;}
    public string RedirectToController { get; set;}

    protected bool ApplyFilter(ExceptionContext filterContext)
    {
        Type lExceptionType = filterContext.Exception.GetType();
        return (ExceptionType == null ||
                lExceptionType.Equals(ExceptionType));
    }


    #region IExceptionFilter Members
    public void OnException(ExceptionContext filterContext)
    {

        if (ApplyFilter(filterContext))
        {
            IbfControllerLogger.Log(filterContext.Exception);

            filterContext.ExceptionHandled = true;

            #region Calculate Action Controller Error
            RouteValueDictionary lRoutes = new RouteValueDictionary(new
                {
                    action = RedirectToAction,
                    controller = String.IsNullOrEmpty(RedirectToController) ? (string)filterContext.RouteData.Values["controller"] : RedirectToController
                });
            UrlReWriterUtils.UrlReWriter(filterContext.Controller.ViewData, lRoutes);
            #endregion

            filterContext.Controller.TempData[TempDataName.C_TEMPDATA_EXCEPTIONERROR] = filterContext.Exception;
            filterContext.Result = new RedirectToRouteResult(lRoutes);
        }
    }
    #endregion

لماذا لا ننشئ ErrorResult بنفسك المستمدة من ActionResult؟

ما أفعله (والذي قد يكون أو لا يكون ممارسة جيدة) هو هذا:

عند حدوث خطأ:

  • إذا كنت أتوقع ذلك وأستطيع التعامل معه، سأفعل (تسجيله باستخدام ELMAH)
  • إذا كنت أتوقع ذلك ولم أستطع التعامل معه، أقوم بتسجيل الدخول إلى ELMAH وأرجع ViewResult وهي صفحة الخطأ الخاصة بي
    • قم بتضمين وصف للخطأ ورسالة قياسية ورابط للعودة إلى ما كنت أفعله
  • إذا لم أكن أتوقع ذلك، فإن تجاوز OnError في فئة وحدة التحكم الأساسية الخاصة بي يؤدي إلى تنفيذ الخطوة السابقة
  • يتم تسجيل جميع الأخطاء الأخرى التي لا يمكن معالجتها تلقائيًا بواسطة ELMAH والشاشات الصفراء للطلب

معظم معالجة الأخطاء العامة الخاصة بي تذهب إلى الفئة الأساسية لجميع وحدات التحكم الخاصة بي.المشكلة الوحيدة هي أنه لا بد لي من تعيين وحدة التحكم وقيمة الإجراء يدويًا في الفئة الأساسية حتى تتمكن من إنشاء ActionLink لإعادة التوجيه في صفحة الخطأ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top