2013-06-03 12 views
5

मैं निम्नलिखित मैप किया मार्गasp.net-MVC मार्ग मुद्दा: मापदंडों शब्दकोश पैरामीटर

संपादित के साथ कस्टम मार्ग स्थापित करने के लिए कोशिश कर रहा हूँ के लिए एक अशक्त प्रविष्टि शामिल हैं: मेरा पूरा मार्ग config

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

     #region FixtureAdmin 

     routes.MapRoute(
      name: "FixtureEdit", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "FixtureAdmin", action = "Edit", id = UrlParameter.Optional } 
     ); 

     #endregion 

     #region Results 

     routes.MapRoute(
      name: "ResultAdd", 
      url: "{controller}/{action}/{fixtureId}", 
      defaults: new { controller = "Result", action = "Add", fixtureId = UrlParameter.Optional } 
     ); 

     #endregion 

और मेरी नियंत्रक कोड

public ActionResult Add(int fixtureId) 
    { 
     // return model to view etc.. 
    } 

यह अपवाद के साथ आ रहा है, भले ही मैं वैकल्पिक के रूप में पैरामीटर निर्दिष्ट किया है।

मापदंडों शब्दकोश पैरामीटर के लिए एक अशक्त प्रविष्टि शामिल 'fixtureId'

अजीब बात है, अगर मैं कार्रवाई जोड़ें के मानदंड को बदलना सिर्फ 'Id' तो निम्न URL परिणाम काम करेंगे करने के लिए है// 1 जोड़ें। मैं उलझन में हूं, क्या कोई डिफ़ॉल्ट रूटिंग है जो मेरे कस्टम एक को ओवरराइड कर रही है? पैरामीटर को केवल 'आईडी' काम में क्यों बदलना होगा?

संपादित

बस का परीक्षण करने, मैं कार्रवाई

public ActionResult Add(int? fixtureId, int? testId) 

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

+0

उनके किसी अन्य मार्ग भी पहले या इस – rajansoft1

+1

के बाद के लिए कॉन्फ़िगर आप कॉल करने में सक्षम होना चाहते हैं, तो है आईडी निर्दिष्ट किए बिना 'जोड़ें', 'स्थिरता आईडी' शून्य होनी चाहिए - 'int? fixtureId'। "वैकल्पिक" मार्ग के संदर्भ में इसका मतलब है यह, यूआरएल में होने की जरूरत नहीं है, ताकि आप 'public ActionResult जोड़ें (जैसे कार्यों हो सकता है) {/ * कोई पैरामीटर * /}' – Alex

+0

केवल बात मैं के बारे में सोच सकते हैं क्या आप एक इंट का उपयोग कर रहे हैं जो गैर-शून्य है? आईडी शायद एमवीसी ढांचे में बेक किया गया है, इसलिए संभवतः अलग-अलग काम करता है। – David

उत्तर

6

अपने कंट्रोलर एक्शन में एक निरर्थक int का उपयोग करें।

public ActionResult Add(int? fixtureId) 
{ 
    // return model to view etc.. 
} 

लेकिन सवाल है, अगर वह वास्तव में एक आईडी है, यह कैसे प्रतिक्रिया करता है, तो एक अशक्त/खाली आईडी उपयोगकर्ता द्वारा अनुरोध किया है होगा? क्या यह आईडी आपके डीबी में एक कुंजी है? यदि आप आईडी खाली/शून्य हैं तो आप इसे डिफ़ॉल्ट पृष्ठ को संभालने या प्रदान करने में सक्षम हैं, तो आप इसे शून्य बना सकते हैं।

संपादित करें:

इसका कारण यह है ASP.NET समझेंगे कि अपने अनुरोध में एक अज्ञात पैरामीटर id है, आपके मामले में, Results/Add/1, 1 अज्ञात है। यदि आप fixtureId का उपयोग कर उस कोड को काम करना चाहते हैं, तो आपको Results/Add?fixureId=1 का उपयोग करना चाहिए। तो आखिरकार, यह रूटिंग के कारण नहीं है, बल्कि इसके बजाय, यह आपके पास की गई कार्रवाई में पैरामीटर की वजह से है।

EDIT2:

इसके अलावा, क्या आप एक मार्ग संघर्ष कहा जाता है का सामना कर रहे। आपके मार्ग Default से विवादित हैं। आप constraints लागू करने का प्रयास कर सकते हैं।

+0

मैं इसे व्यर्थ बनाने और तदनुसार संभाल कर सकते हैं। समस्या यह है कि जब मैं वास्तव में परिणाम/जोड़ें/1 के साथ एक मान पास करता हूं उदाहरण के लिए पास किया गया मान हमेशा शून्य होता है। – nik0lias

+0

मेरा संपादन देखें। – aiapatag

+1

ठीक है, ऐसा दिखता है जैसे पर्याप्त होगा, मैं यदि संभव हो तो उपयोगकर्ता से छिपाने के मानकों जाना चाहते थे लेकिन ऐसा करने के लिए प्रपत्र पोस्टिंग, धन्यवाद के साथ हो सकता है। – nik0lias

1

डेवलपर को 'NullableConstraint' clicky link कहने के इस विधि को देखें, तो यदि वैकल्पिक पैरामीटर की आपूर्ति की जाती है तो आप इसके मूल्य पर कुछ जांच कर सकते हैं।

और सरल, क्लीनर समाधान के लिए स्वीकृत उत्तर के बाद उत्तर को भी देखें।

2

2, अपनी पोस्ट से मुझे लगता है कि आपकी समस्या को इस तरह डिफ़ॉल्ट के बाद अपने कस्टम मार्ग डाल, है:

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

     routes.MapRoute(
     name: "ResultAdd", 
     url: "{controller}/{action}/{fixtureId}", 
     defaults: new { controller = "Home", action = "Add", fixtureId = UrlParameter.Optional } 

तो: 1/अपवाद "पैरामीटर शब्दकोश पैरामीटर के लिए 'एक अशक्त प्रविष्टि शामिल fixtureId ' "यदि आप कोई कदम लिंक या मार्ग फार्म के लिए विशिष्ट मार्ग नाम दे क्योंकि MVC मार्ग के डिफ़ॉल्ट रूट का उपयोग करेगा न आ जाएगा। तो तुम, काम किया जा सकता है इस तरह अपने कस्टम मार्ग के लिए विशिष्ट मार्ग नाम देने के लिए की जरूरत है:

@Html.ActionLink("Test custom Route", "Add", "Home", new { fixtureId = 1 }, "ResultAdd") 

चीयर

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