2014-07-24 5 views
7

मैं एक एएसपी.नेट एमवीसी ऐप लिख रहा हूं और मुझे निम्नलिखित समस्या का सामना करना पड़ा। मैं त्रुटियों के बारे में विस्तृत जानकारी के साथ कस्टम त्रुटि पेज बनाना चाहता हूं (जैसे त्रुटि संदेश या नियंत्रक त्रुटि का कारण बनता है), लेकिन मैं मॉडल को हैंडलइररइन्फो ऑब्जेक्ट के साथ दृश्य पर प्रदान नहीं कर सकता।मैं किसी ऑब्जेक्ट के साथ हैंडलररफ़ोइफ़ मॉडल कैसे प्रदान कर सकता हूं?

पहले तो मुझे Web.config फ़ाइल कस्टम त्रुटियों संभालने के लिए तैयार:

public class ErrorController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View("Error"); 
    } 

    public ViewResult NotFound() 
    { 
     Response.StatusCode = 404; 
     return View("NotFound"); 
    } 
} 

और देखें पर मैं कहा:

<customErrors mode="On" defaultRedirect="~/Error"> 
    <error statusCode="404" redirect="~/Error/NotFound"/> 
</customErrors> 

तो मैं त्रुटि नियंत्रक त्रुटि विचारों का प्रबंधन करने के लिए बनाया मॉडल का प्रकार:

@model System.Web.Mvc.HandleErrorInfo 

लेकिन मॉडल हर समय शून्य है और मुझे नहीं पता कि सही कैसे पास किया जाए दृश्य में त्रुटि विवरण के साथ ऑब्जेक्ट करें और यह ऑब्जेक्ट कहां बनाया जाना चाहिए। क्या आप मेरी मदद कर सकते हैं? क्या यह इस तरह से करना संभव है?

उत्तर

12

तो आप यहां दो अलग-अलग परतों से निपट रहे हैं। <customErrors> मुख्य एएसपी.नेट ढांचे के अलावा है। फिर HandleError एमवीसी ढांचे के अलावा है। जब आप <customErrors> ASP.NET का उपयोग करते हैं, तो अपवाद जानकारी को किसी दृश्य में कैसे पास किया जाए, इस बारे में अनजान है, यह आपको केवल त्रुटि पृष्ठ पर लोड/रीडायरेक्ट करेगा।

दृश्य कार्य करने के लिए, आपको सब कुछ एमवीसी पारिस्थितिक तंत्र के अंदर रखना होगा। तो आपको HandleErrorAttribute, या एक भिन्नता का उपयोग करने की आवश्यकता होगी। You can see in the source code of the attribute यह पता लगाने का प्रयास करता है कि एक अनचाहे अपवाद कब हुआ है, और यदि कस्टम त्रुटियां सक्षम हैं, तो को HandleErrorInfo के उदाहरण के साथ एक नया ViewResult स्पिन करें जिसमें इसके अंदर अपवाद जानकारी है।

ध्यान देने योग्य, एक डिफ़ॉल्ट एमवीसी प्रोजेक्ट में, HandleErrorAttributeApp_Start/FilterConfig.cs फ़ाइल के अंदर एक वैश्विक फ़िल्टर के रूप में लागू किया गया है।

+0

धन्यवाद, अब सब कुछ ठीक काम करता है। –

+0

बहुत उपयोगी, मैं जो भी लापता था वह फिल्टर था, किसी कारण से मैंने टिप्पणी की। धन्यवाद! – Alex

+1

मेरे पास @Roman के समान सेट अप है, लेकिन मुझे अभी भी त्रुटि देखें में HandleErrorInfo शून्य होने का सामना करना पड़ रहा है। मेरे पास फ़िल्टर पंजीकृत है और नियंत्रकों पर [हैंडलरर] भी है। क्या कोई कुछ प्रकाश फेंक सकता है। –

1

यह मेरे लिए काम नहीं किया है, लेकिन है कि मेरी Global.asax.Application_Start() तो जैसे FilterConfig वर्ग पंजीकृत नहीं किया खोजने के लिए मुझे प्रेरित किया:

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 

यह, स्टीवन वी के जवाब के साथ मिलकर मेरी अशक्त मॉडल समस्या हल हो गई।

5

मुझे एक और तरीका मिला। नियंत्रक से देखने के लिए त्रुटि मॉडल भेज रहा है।

1. Global.asax

protected void Application_Error(object sender, EventArgs e) 
{ 
    var httpContext = ((MvcApplication)sender).Context; 
    var currentController = " "; 
    var currentAction = " "; 
    var currentRouteData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext)); 

    if (currentRouteData != null) 
    { 
     if (currentRouteData.Values["controller"] != null && !String.IsNullOrEmpty(currentRouteData.Values["controller"].ToString())) 
     { 
      currentController = currentRouteData.Values["controller"].ToString(); 
     } 

     if (currentRouteData.Values["action"] != null && !String.IsNullOrEmpty(currentRouteData.Values["action"].ToString())) 
     { 
      currentAction = currentRouteData.Values["action"].ToString(); 
     } 
    } 

    var ex = Server.GetLastError(); 
    //var controller = new ErrorController(); 
    var routeData = new RouteData(); 
    var action = "GenericError"; 

    if (ex is HttpException) 
    { 
     var httpEx = ex as HttpException; 

     switch (httpEx.GetHttpCode()) 
     { 
      case 404: 
       action = "NotFound"; 
       break; 

      // others if any 
     } 
    } 

    httpContext.ClearError(); 
    httpContext.Response.Clear(); 
    httpContext.Response.StatusCode = ex is HttpException ? ((HttpException)ex).GetHttpCode() : 500; 
    httpContext.Response.TrySkipIisCustomErrors = true; 

    routeData.Values["controller"] = "Error"; 
    routeData.Values["action"] = action; 
    routeData.Values["exception"] = new HandleErrorInfo(ex, currentController, currentAction); 

    IController errormanagerController = new ErrorController(); 
    HttpContextWrapper wrapper = new HttpContextWrapper(httpContext); 
    var rc = new RequestContext(wrapper, routeData); 
    errormanagerController.Execute(rc); 
} 

2. त्रुटि नियंत्रक:

public class ErrorController : Controller 
{ 
    // 
    // GET: /Error/ 

    public ActionResult Index() 
    { 
     return RedirectToAction("GenericError", new HandleErrorInfo(new HttpException(403, "Dont allow access the error pages"), "ErrorController", "Index")); 
    } 

    public ViewResult GenericError(HandleErrorInfo exception) 
    {    
     return View("Error", exception); 
    } 

    public ViewResult NotFound(HandleErrorInfo exception) 
    {   
     ViewBag.Title = "Page Not Found"; 
     return View("Error", exception); 
    }   
} 

3. देखें/साझा/Error.cshtml:

@model System.Web.Mvc.HandleErrorInfo 
@{ 
    ViewBag.Title = ViewBag.Title ?? "Internal Server Error"; 
} 
<div class="list-header clearfix"> 
    <span>Error : @ViewBag.Title</span> 
</div> 
<div class="list-sfs-holder"> 
    <div class="alert alert-error"> 
     An unexpected error has occurred. Please contact the system administrator. 
    </div> 
    @if (Model != null && HttpContext.Current.IsDebuggingEnabled) 
    { 
     <div> 
      <p> 
       <b>Exception:</b> @Model.Exception.Message<br /> 
       <b>Controller:</b> @Model.ControllerName<br /> 
       <b>Action:</b> @Model.ActionName 
      </p> 
      <div style="overflow: scroll"> 
       <pre> 
        @Model.Exception.StackTrace 
       </pre> 
      </div> 
     </div> 
    } 
</div> 

4. वेब।config:

<system.web> 
    <customErrors mode="Off" /> 
</system.web> 

क्रेडिट:https://thatsimpleidea.wordpress.com/2013/10/28/mvc-error-page-implementation/#comment-166

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

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