8

एमवीसी 4 में कुछ मार्ग पकड़ने का प्रयास करते समय (मुझे कुछ उदाहरण मिल गए हैं, और मेरे कोड पर आधारित है) यह 404 त्रुटि देता है। मैं इसे आईआईएस 7.5 पर चला रहा हूं। यह एक सीधा आगे समाधान की तरह लगता है, तो मुझे क्या याद आ रही है?एमवीसी 4 पकड़ें सभी मार्ग कभी नहीं पहुंचे

एक नोट, यदि मैं "डिफ़ॉल्ट" मार्ग से ऊपर "कैचअल" मार्ग चलाता हूं तो यह काम करता है। लेकिन निश्चित रूप से तब तक कोई अन्य नियंत्रक कभी नहीं पहुंचे हैं।

यहाँ कोड है:

Route.Config:

 routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

     routes.MapRoute(
      "CatchAll", 
      "{*dynamicRoute}", 
      new { controller = "CatchAll", action = "ChoosePage" } 
     ); 

नियंत्रक:

public class CatchAllController : Controller 
{ 

    public ActionResult ChoosePage(string dynamicRoute) 
    { 
     ViewBag.Path = dynamicRoute; 
     return View(); 
    } 

} 

उत्तर

9

मोहक मार्ग बनाने का अंतिम लक्ष्य गतिशील यूआरएल को संभालने के लिए सक्षम होने के लिए था और मैं करने के लिए एक सीधा जवाब खोजने में असमर्थ था के बाद से ऊपर मूल मुद्दा, मैंने एक अलग परिप्रेक्ष्य से अपने शोध से संपर्क किया। ऐसा करने में मैं इस ब्लॉग पोस्ट में आए: Custom 404 when no route matches

यह समाधान किसी दिए गए यूआरएल के भीतर कई वर्गों की हैंडलिंग की अनुमति देता है (यानी www.mysite.com/this/is/a/dynamic/route)

यहाँ अंतिम कस्टम नियंत्रक कोड है:

public override IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) 
{ 
    if (requestContext == null) 
    { 
     throw new ArgumentNullException("requestContext"); 
    } 

    if (String.IsNullOrEmpty(controllerName)) 
    { 
     throw new ArgumentException("MissingControllerName"); 
    } 

    var controllerType = GetControllerType(requestContext, controllerName); 

    // This is where a 404 is normally returned 
    // Replaced with route to catchall controller 
    if (controllerType == null) 
    { 
     // Build the dynamic route variable with all segments 
     var dynamicRoute = string.Join("/", requestContext.RouteData.Values.Values); 

     // Route to the Catchall controller 
     controllerName = "CatchAll"; 
     controllerType = GetControllerType(requestContext, controllerName); 
     requestContext.RouteData.Values["Controller"] = controllerName; 
     requestContext.RouteData.Values["action"] = "ChoosePage"; 
     requestContext.RouteData.Values["dynamicRoute"] = dynamicRoute; 
    } 

    IController controller = GetControllerInstance(requestContext, controllerType); 
    return controller; 
} 
+2

यह अच्छी तरह से काम करता है। यदि आप ऐसा करते हैं तो आप foreach और substring से बच सकते हैं: 'var dynamicRoute = string.Join ("/", requestContext.RouteData.Values.Values);' –

+0

अच्छी कॉल नाथन। थोड़ी देर हो गया क्योंकि मैंने इस कोड को देखा था। मैं हमेशा पुराने कोड को सुधारने के तरीके ढूंढता हूं। यह निश्चित रूप से उन समयों में से एक है। मैंने आपके सुझाव के साथ उत्तर अपडेट किया है। धन्यवाद! – gsxrboy73

+0

एसओ इसके लिए बहुत अच्छा है, मैं यहां आने पर लगभग हर बार कुछ सीखता हूं। यह कोड बहुत अच्छा था, मैं यह पता लगाने की कोशिश कर रहा था कि क्या मैं इसे मूल नियंत्रक में संभालना चाहता हूं, लेकिन इसे नियंत्रक फैक्ट्री तक दबाकर एक बेहतर विचार है! –

4

यह शायद इसलिए है क्योंकि जो कुछ भी मार्ग your're के साथ अपने 1 मिलान किया जाता है इस परीक्षण - डिफ़ॉल्ट मार्ग। जिस तरह से एमवीसी काम करता है, आपके द्वारा पारित कोई भी पता उपस्थिति के क्रम में आपके मार्ग संग्रह में मार्गों से मिलान करने का प्रयास करेगा। एक बार यह पहला मिलान मार्ग खोजने के बाद यह आगे निष्पादन बंद कर देता है। इस मामले में आपका डिफ़ॉल्ट मार्ग सूची में पहला है, इसलिए यदि आपका मिलान किया जाता है तो आपका दूसरा मार्ग कभी भी जांच नहीं किया जाएगा।

मूल रूप से आपके पता बार में http://www.mysite.com/Home/Testing/Item/Page जैसे कुछ लिखें और यह आपके डिफ़ॉल्ट मार्ग से मेल खाने में विफल होना चाहिए और फिर कैचअल रूट से मिलान करने का प्रयास करें।

+1

यह वह मार्ग है जिसका मैं परीक्षण कर रहा हूं: http://mysite.com/hello, जिसके लिए मेरे पास कोई नियंत्रक नहीं है। – gsxrboy73

+1

इससे कोई फर्क नहीं पड़ता कि आपके पास मार्ग के लिए नियंत्रक नहीं है, फिर भी यह पहले अनुक्रमिक मिलान मार्ग को इस पर ध्यान दिए बिना (इस मामले में "डिफ़ॉल्ट") पर जा रहा है। यह एक वर्ग हैलो कंट्रोलर की तलाश करेगा: इंडेक्स एक्शन के साथ नियंत्रक और यदि इसे नहीं मिला है, तो आपको 404 मिलेगा। – cchamberlain

0

अपने मार्ग पर वैकल्पिक स्ट्रिंग dynamicRoute पैरामीटर को परिभाषित करने का प्रयास करें:

routes.MapRoute( 
     "CatchAll", 
     "{*dynamicRoute}", 
     new { controller = "CatchAll", action = "ChoosePage", dynamicRoute = UrlParameter.Optional }); 
+0

बस कोशिश की, वही परिणाम। कोशिश करने के लिए धन्यवाद। – gsxrboy73

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