2014-06-13 11 views
8

में अपवाद फ़िल्टर का उपयोग कैसे करें मैं एमवीसी 5 में अपवाद फ़िल्टर कैसे कार्यान्वित कर सकता हूं।एमवीसी 5

मैं NLog को अपवाद फेंक और एक डिफ़ॉल्ट त्रुटि पृष्ठ जो प्रदर्शित करता है "कुछ गलत हो गया है"

मैं के रूप में

using System; 
using System.Diagnostics; 
using System.Security.Policy; 
using System.Web.Mvc; 
using System.Web.Mvc.Filters; 
using System.Web.Routing; 
using System.Web.UI.WebControls; 
using Delivros.UI.Controllers; 
using Delivros.UI.Areas.User.ViewModel; 
using System.Web; 

namespace Delivros.UI.Filters 
{ 

public class CustomAuthenticationFilter : IAuthenticationFilter 
{ 
    public void OnAuthentication(AuthenticationContext filterContext) 
    { 

    } 

    public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext) 
    { 
     Debug.WriteLine("OnAuthenticationChallenge : MyAuthenticationFilter"); 
    } 
} 
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public class MyAuthorizationFilter : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext.RequestContext.HttpContext.Request.Cookies[System.Configuration.ConfigurationManager.AppSettings[Convert.ToString(CookieField.cookieName)]] == null) 
     { 

     } 
     else 
{ 
      filterContext.Result = new RedirectToRouteResult(
      new RouteValueDictionary 
    { 
       { "controller", "User" }, 
       { "action", "UserRegistration" } , 
       {"Area","User"} 
      }); 

     } 
    } 
} 
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public class CustomActionFilter : ActionFilterAttribute 
{ 
    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1)); 
     filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false); 
     filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
     filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     filterContext.HttpContext.Response.Cache.SetNoStore(); 
     base.OnResultExecuted(filterContext); 
     filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary 
      { 
       { "controller", "User" }, 
       { "action", "UserRegistration" } , 
       {"Area","User"} 
      }); 
     // ActionResult home = new HomeController().Index();   
    } 
} 

public class MyResultFilter : IResultFilter 
{ 
    public void OnResultExecuting(ResultExecutingContext filterContext) 
    { 

    } 

    public void OnResultExecuted(ResultExecutedContext filterContext) 
    { 

    } 
} 

public class MyExceptionFilter : IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary 
      { 
       { "controller", "User" }, 
       { "action", "UserLogOut" } , 
       {"Area","User"} 
      }); 

    } 
} 

}

इस प्रकार एक फिल्टर वर्ग के लिए पेज रीडायरेक्ट करना चाहते हैं

लेकिन कुछ भी नहीं पृष्ठ पर रीडायरेक्ट कर रहा है ...

उत्तर

18

आप अपनी खुद की HandleErrorAttribute

01 प्राप्त कर सकता है
public class NLogExceptionHandlerAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     // log error to NLog 
     base.OnException(filterContext); 
    } 
} 

तो यह रजिस्टर विश्व स्तर पर

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new NLogExceptionHandlerAttribute()); 
    ... 
} 

डिफ़ॉल्ट रूप से, HandleErrorAttributeError~/Views/Shared फ़ोल्डर में स्थित दृश्य दिखाएगी, लेकिन आप विशेषता का View संपत्ति सेट कर सकते हैं यदि आप एक विशेष दृश्य प्रदर्शित करने के लिए करना चाहता था ।

+0

मुझे इस कक्षा को NLogExceptionHandlerAttribute कहां रखना चाहिए? – TechNo

+0

@SajnaAli यह सिर्फ एक विशेषता है, एमवीसी में अन्य सभी विशेषताओं के समान है, इसलिए इसे एक क्रिया, नियंत्रक के खिलाफ रखा जा सकता है या आप इसे विश्व स्तर पर पंजीकृत कर सकते हैं (जो आप चाहते हैं)। मैंने एक उदाहरण दिया है कि आप यह कैसे करते हैं। – James

+0

global.asax फ़िल्टरकॉन्फिग में पंजीयन में पहले से ही एक पंक्ति है। रजिस्ट्रार ग्लोबल फ़िल्टर (ग्लोबल फ़िल्टरर्स। फ़िल्टर); क्या हमें वैश्विक.एक्सएक्स फ़ाइल में ऊपर उल्लिखित रेखा जोड़नी चाहिए? यह त्रुटियों को दिखा रहा है – TechNo

0

मेरा मानना ​​है कि यह इस कोड को होना चाहिए:

public class MyExceptionFilter : IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { 
      action = "UserLogOut", 
      controller = "User", 
      area = "User" 
     })); 

    } 

}

आप "अगर (filterContext.ExceptionHandled!)" बयान से पहले परिणाम के अंदर मूल्यों प्रवेश करने लगता है कि बनाने के लिए एक अतिरिक्त जोड़ सकते हैं पल के लिए अपवाद अनचाहे है।

संबंधित मुद्दे