2008-11-25 11 views
14

मुझे यह पता लगाना प्रतीत नहीं होता है। मैं एमवीसी बीटा के साथ प्रयोग कर रहा हूं और एक कैचल रूट को लागू करने की कोशिश कर रहा हूं जैसे कि अगर mysite.com/home/index के बजाय उपयोगकर्ता mysite.com/blah में प्रवेश करता है तो यह "त्रुटि" मार्ग पर पहुंच जाएगा।नेट एमवीसी रूटिंग कैचल काम नहीं कर रहा

दुर्भाग्यवश ऐसा लगता है कि "डिफ़ॉल्ट" मार्ग हमेशा "ब्लाह" पकड़ता है। असल में एकमात्र रास्ता मैं "त्रुटि" मार्ग पर पहुंचने में सक्षम हूं, जिसमें ब्लाह/ब्लाह/ब्लाह/ब्लाह है।

क्या यह काम करना है, क्योंकि मैंने अन्य उदाहरणों को देखा है जिनमें "डिफ़ॉल्ट" और "त्रुटि" मार्ग इस तरह स्थापित है और ऐसा लगता है कि अगर वे एक नियंत्रक में टाइप करना चाहते थे अस्तित्व में नहीं है यह "त्रुटि" मार्ग मारा जाएगा।

क्या कुछ ऐसा है जो मुझे याद आ रहा है (बहुत संभव है) या क्या मुझे बस प्रत्येक नियंत्रक के लिए एक विशिष्ट मार्ग बनाना होगा?

कोड मैं उपयोग कर रहा हूँ:

 routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
     ); 

     routes.MapRoute(
      "Error", 
      "{*catchall}", 
      new { controller = "Base", action = "Error", id = "404" } 
     ); 

धन्यवाद, जेफ

उत्तर

2

MVC मार्गों आदेश है कि वे दर्ज की जाती हैं में जाँच कर रहे हैं।

माइसाइट/ब्लाह डिफ़ॉल्ट मार्ग से मिलेगा। नियंत्रक blah होगा, और कार्रवाई सूचकांक है।

जब आप माइसाइट/ब्लाह/ब्लाह/ब्लाह/ब्लाह मार्ग में प्रवेश करते हैं तो आपने इसे एक मार्ग दिया है, यह डिफ़ॉल्ट मार्ग को मैप नहीं कर सका और फिर आपका पकड़ मार्ग कहा जाता था।

उन अन्य उदाहरणों के लिए, क्या आपने देखा कि क्या उनके पास कुछ त्रुटि फ़िल्टर सेटअप हैं? मुझे पूरा यकीन है कि डिफ़ॉल्ट asp.net mvc साइट में पहले से मौजूद पृष्ठों पर कुछ त्रुटि हैंडलिंग विशेषताएँ हैं।

+0

धन्यवाद, यह समझ है कि मैं आया हूं, लेकिन मैंने जो देखा है उसके आधार पर स्वीकार नहीं करना चाहता था, और मैं क्या उम्मीद करता हूं। लेकिन मैं इससे निपटने के लिए सीखूंगा। –

5

क्रम त्रुटियों को संभाल करने के लिए मैं अपनी परियोजनाओं में से एक में Application_Error घटना प्रयोग किया है:

protected void Application_Error(object sender, EventArgs e) 
{ 
    Exception exception = Server.GetLastError(); 
    HttpException httpException = exception as HttpException; 
    if (httpException != null) 
    { 
     RouteData routeData = new RouteData(); 
     routeData.Values.Add("controller", "Error"); 
     routeData.Values.Add("action", "HttpError500"); 

      if (httpException.GetHttpCode() == 404) 
      { 
       routeData.Values["action"] = "HttpError404"; 
      } 

     Server.ClearError(); 
     Response.Clear(); 
     IController errorController = new ErrorController(); 
     errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); 
    } 
} 
+0

अपवाद हैंडलिंग करने के लिए यह गलत जगह है, और आप इसे उड़ाकर अपवाद का अर्थ भी बदल रहे हैं।यह संभवतः डीबगिंग को बहुत मुश्किल बना सकता है। –

+1

मुझे नहीं पता कि एप्लिकेशन_इरर हैंडलर का उपयोग क्यों डीबगिंग मुश्किल बना देगा। यदि आप अपवाद लॉग करते हैं तो आपके पास पूर्ण स्टैक ट्रेस होगा। * कैचल रूट के साथ एक और समस्या यह है कि अगर नियंत्रक कार्रवाई में कोई अपवाद होता है तो उसे नहीं कहा जाएगा, इसलिए यदि आप 500 त्रुटियों को संभालना चाहते हैं तो आपको इसे कहीं और करने की आवश्यकता होगी। मैं एक ही स्थान पर सभी अपवाद हैंडलिंग कोड पसंद करते हैं। –

+0

सबसे बड़ी समस्या यह है कि जब तक त्रुटि सत्र ऑब्जेक्ट के लिए अपना रास्ता बनाती है, तब तक आप अपना बहुत से संदर्भ खो देते हैं, और यदि आप उन चीजों के लिए जिम्मेदार नहीं हैं, तो डिबगिंग एक दुःस्वप्न बन जाती है। –

6

आपका पहला मार्ग के बाद से आप तत्वों के लिए चूक है सबसे यूआरएल पकड़ेगा, तो आप इस मार्ग का उपयोग करते हुए कल्पना कर सकते हैं

Route Debugger

+0

यह भी उपयोगी लग रहा है। धन्यवाद! –

0

यह भी मदद कर सकते हैं जब MVC मोहक समस्याओं से निपटने:

फिल Haack से डिबगर, लिंक देखें
routes.MapRoute(
    "Default",            // Route name 
    "{controller}/{action}/{*id}",       // URL with parameters 
    new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
); 

वह कहां है, जहां यह {id} कहता है, इसे {*id} पर बदलें। इस अंतिम आईडी पैरामीटर के रूप में ज्यादा अतिरिक्त पथ का उपभोग करने के रूप में पास किए जा सकता है की अनुमति देता है डिफ़ॉल्ट नियम यह स्वीकार करता है:।

/व्यक्ति/नाम/जो

लेकिन इस:

/उत्पादों/सूची/sortby/name

दूसरा यूआरएल रूट में इस संशोधन के बिना 404 फेंक देगा।

+0

मैंने यह कोशिश की है और पूरे इंटरनेट पर इसे समझने की कोशिश कर रहा है लेकिन यह मेरे लिए काम नहीं करता है। अगर मैं यूआरएल में 2 सेगमेंट पास करता हूं तो मुझे 404 त्रुटि मिलती है कि क्या मैं तारांकन जोड़ता हूं या नहीं। कोई सलाह? – DavidHyogo

+0

यह एक नया प्रश्न के रूप में सबसे अच्छा हो सकता है - आप जो डिफ़ॉल्ट सेट कर रहे हैं (इस उदाहरण में तीसरी पंक्ति) क्या हैं? एक पूर्ण कोड नमूना सबसे अच्छा होगा जिसके लिए एक अलग प्रश्न की आवश्यकता होगी। –

+0

अच्छा विचार क्रिस, लेकिन मुझे मेरी मूर्खतापूर्ण गलती मिली। मैं एमवीसी 4 के लिए गलत जगह पर अपने मार्गों को परिभाषित कर रहा था, और उन्हें अनदेखा किया जा रहा था। Http://stackoverflow.com/questions/7515644/infinite-url-parameters-for-asp-net-mvc-route/14835667#14835667 पर मेरा उत्तर देखें, अब मैं खुशी से सभी तरह की फैंसी मार्ग परिभाषाएं बना रहा हूं! – DavidHyogo

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