2009-07-23 9 views
5

मैं एक asp.net MVC 1.0 साइट जब चीजें एक दृश्य करने के लिए सही लेख नक्शे काम करते हैं और दृश्य प्रदान की गई हो जाता है कि एक 2 स्तरीय पदानुक्रम /श्रेणी/लेखएएसपीनेट एमवीसी में 'अवलोकन नहीं मिला' अमान्य ऑपरेशन अपवाद को कैसे संभालें?

से कुछ सामग्री में कार्य करता है है। हालांकि, जब यूआरएल रूटिंग की स्थिति को पूरा करता है लेकिन दृश्य मौजूद नहीं है तो अपवाद उठाया जाता है कि मैं नियंत्रक कार्रवाई में जाल नहीं कर सकता।

रूटिंग:

routes.MapRoute(
    "Article", 
    "{category}/{article}.aspx", 
    new { controller = "MyController", action = "Article" } 
); 

MyController कार्रवाई:

public ActionResult Article(string category, string article) 
{ 
    string path = string.Format("~/Views/{0}/{1}.aspx", category, article); 
    ViewResult vr = View(path); 
    return vr; 
} 

हालांकि, जब दृश्य नहीं मिला है, एक System.InvalidOperationException उत्पन्न होता है कि मैं नियंत्रक कार्रवाई में नहीं पकड़ सकते।

अपवाद विवरण: System.InvalidOperationException: दृश्य '~/दृश्य/मेरी-श्रेणी/मेरी-लेख-साथ-लंबी name.aspx' या अपने गुरु नहीं पाया जा सका। निम्न स्थानों की खोज गया: ~/दृश्य/मेरी-श्रेणी/मेरी-लेख-साथ-लंबी name.aspx

मैं global.asax.cs में जाल Application_Error() विधि में त्रुटि लेकिन कर सकते हैं:

  1. से वहाँ
  2. आश्चर्य त्रुटि को देखने के लिए पुनर्निर्देशित करने के लिए कैसे ही कोई बेहतर जगह है जहाँ अपवाद उठाया है के करीब है पता नहीं है।

उत्तर

7

xandy, ग्रेग, मैं अपने जवाब की सराहना करते हैं। इस आलेख (Strategies For Resource Based 404 Errors in aspnet mvc) ने मुझे उस समाधान को प्राप्त करने में मदद की जो मैं एक सुंदर साफ तरीके से ढूंढ रहा था। मुझे बस इतना करना है कि नियंत्रक ओवरराइड करें।OnException। चूंकि मेरे पास केवल एक नियंत्रक है जहां मुझे व्यवहार की आवश्यकता है, मुझे केवल उस नियंत्रक में ऑनएक्सप्शन को ओवरराइड करना होगा।

कहा जा रहा है कि, मेरा समाधान लक्षणों का इलाज नहीं करता है और जैसा कि आप दोनों सुझाव देते हैं, यह आमंत्रित करने से पहले फ़ाइल के अस्तित्व की जांच करना बेहतर होगा। पथ पर देखें।

यहाँ कोड मैं लक्षण :)

protected override void OnException(ExceptionContext filterContext) 
{ 
    //InvalidOperationException is thrown if the path to the view 
    // cannot be resolved by the viewengine 
    if (filterContext.Exception is InvalidOperationException) 
    { 
     filterContext.ExceptionHandled = true; 
     filterContext.Result = View("~/Views/Error/NotFound.aspx"); 
     filterContext.HttpContext.Response.StatusCode = 404; 
    } 

    base.OnException(filterContext); 
} 

एक मुद्दा मैं हल नहीं कर सका एक साफ तरह से NotFound देखें प्रदर्शित करने के लिए कैसे है का इलाज किया जाता है। इसे आमतौर पर ErrorController NotFound Action के माध्यम से एक्सेस किया जाता है। मुझे इसके रास्ते को हार्डकोड करना पड़ा। मैं इसके साथ रह सकता हूं लेकिन यह जानना चाहता हूं कि एचसी पथ संभव है या नहीं।

+0

मैंने समाधान की कोशिश की है और पसंद किया है। एकमात्र समस्या यह है कि यदि आपको किसी भिन्न कारण के कारण एक अवैधऑपरेशन अपवाद मिलता है तो इसका परिणाम 404 होगा। मुझे कुछ क्रमबद्ध करने का प्रयास करते समय ऐसा अपवाद हुआ था। – Bealer

0

मुझे लगता है कि यह देखने के लिए सबसे अच्छी जगह है कि दृश्य मौजूद है नियंत्रक के भीतर होगा। यदि आप दृश्य के कन्स्ट्रक्टर को एन्सेप्लेट करते हैं तो काम नहीं कर रहा है, तो यह एएसपीनेट कन्स्ट्रक्टर के बाहर व्यू के तत्कालता को रोक सकता है (सुनिश्चित नहीं है कि यह है)।

लेकिन एक बात आप की कोशिश कर सकते मैन्युअल रूप से जाँच करें और देखें कि पथ मौजूद है या नहीं, Server.MapPath() का उपयोग कर पूर्ण फ़ाइल पथ हो और अगर यह मौजूद है की जाँच करने के लिए है।

0

मैं सिर्फ एक डिफ़ॉल्ट दृश्य वापस कर दूंगा, शायद 404 प्रतिक्रिया उचित होगी। इस काम को करने के लिए, आपको अपनी वास्तुकला को थोड़ा बदलना होगा।

AFAIK आप यदि फ़ाइल मौजूद है को देखने के लिए, अपने ASPX फाइल में के रूप में यदि आप डिफ़ॉल्ट ढांचे व्यवहार नहीं करना चाहती जाँच करने के लिए कुछ कोड की आवश्यकता होगी। आपको एप्लिकेशन पथ से पथ को हल करने के लिए ResolveURL or Url.Content का उपयोग करना पड़ सकता है।

एक नोट के रूप में, आम तौर पर, यह वास्तव में आपके डोमेन (फ़ाइल नाम) दुनिया के संपर्क में बनाने के लिए सुरक्षित है। यदि एएसपीएक्स सिर्फ डेटा है, तो आपको टेक्स्ट को डेटाबेस या सादे, निष्पादन योग्य टेक्स्ट फ़ाइलों में रखना चाहिए। यदि आप किसी प्रकार का सीएमएस बना रहे हैं (यानी आप वास्तव में 'इंस्टॉलिंग' कार्यक्षमता का एक तरीका चाहते हैं), तो आप ASP.NET कोड के भाग को समाहित करने के लिए आंशिक दृश्य रखने के लिए एएसपीएक्स व्यू का उपयोग करने पर विचार कर सकते हैं।

404 पृष्ठ पर प्राप्त करने के लिए के रूप में, this answer मदद कर सकता है।

3

इसे संभालने के लिए एक उपयुक्त जगह है। यदि आप अपना खुद का व्यूइंजिन लागू करते हैं, तो आप "FileExists" विधि को ओवरराइड कर सकते हैं।

public class ViewEngine : RazorViewEngine 
{ 
    protected override bool FileExists(ControllerContext context, string path) 
    { 
     if(!base.FileExists(context, path)) 
      throw new NotFoundException(); 

     return true; 
    } 

}

तुम बस इतना की तरह अपने Global.asax में दृश्य इंजन रजिस्टर करने की आवश्यकता,

ViewEngines.Engines.Clear(); 
ViewEngines.Engines.Add(new ViewEngine()); 

Application_Error में आप एक हैंडलर कि NotFoundExceptions पकड़ता लागू कर सकते हैं, उन्हें लॉग करता है, तो एक त्रुटि नियंत्रक निष्पादित करने के माध्यम से एक दोस्ताना संदेश देता है।

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