मैं एएसपी.नेट एमवीसी 3 + वेबफॉर्म का उपयोग करके रिपोर्ट प्रस्तुत करने के लिए एक साधारण रिपोर्ट वेब ऐप बना रहा हूं। रिपोर्ट खुद को ReportViewer एएसपी.नेट वेबफॉर्म नियंत्रण द्वारा प्रदान की जाती है, लेकिन मैं पैरामीटर एंट्री बनाने के लिए एएसपी.नेट एमवीसी का उपयोग करना चाहता हूं।एएसपी.नेट एमवीसी + वेबफॉर्म - मार्ग संघर्ष
मैं यह जानना चाहता हूं कि सभी अनुरोध ~/Report
के अनुरोधों को छोड़कर, '~/{नियंत्रक}/{action}/{पैरामीटर}' की डिफ़ॉल्ट रूटिंग योजना का पालन करें, जो वेबफॉर्म को प्रस्तुत करने वाली रिपोर्ट में जाना चाहिए। ऐसा करने का सही तरीका क्या है? डिफ़ॉल्ट एक और WebForms पृष्ठ के लिए एक -
थोड़ा विस्तार ..
मैं Global.asax.cs
में दो मार्गों की है।
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
routes.MapPageRoute("report-rendering", "Report", "~/Render.aspx");
}
यूआरएल ठीक गाया हो, लेकिन इस के साथ समस्या यह है कि जब अनुरोध में आता है, पहले मार्ग भी यूआरएल दूसरा एक, यानी ReportController
पर Index
विधि (कॉल करने के लिए कोशिश करता है ~/Report?id=7
के लिए खाता है जो अस्तित्व में नहीं है)।
अगर मैं इसे बदल ताकि 'रिपोर्ट रेंडरिंग' मार्ग 'डिफ़ॉल्ट' मार्ग से पहले, इसलिए की तरह आता है:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapPageRoute("report-rendering", "Report", "~/Render.aspx");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
अब Html.ActionLink करने के लिए कॉल() ग़लत URL प्रस्तुत करना, यानी
`@Html.ActionLink("Report list", "Index", "ReportList")`
रेंडर
`http://localhost:49910/Report?action=Index&controller=ReportList`
मेरे वर्तमान workaround 'डिफ़ॉल्ट' मार्ग डालता पहले जोड़ते समय एक regex बाधा 'रिपोर्ट' नियंत्रक के लिए अनुरोध की अनदेखी करने, इसलिए जैसे:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new { controller = @"(?!report$).*" }
);
यह साफ महसूस नहीं करता है। फिर, ऐसा करने का सही तरीका क्या है?
इसके अलावा, मैंने अभी तक तय नहीं किया है कि मैं प्रतिपादन फ़ॉर्म में पैरामीटर कैसे पास करूंगा: मैं दोनों क्वेरी पैरामीटर का उपयोग कर सकता हूं या उन्हें पोस्ट कर सकता हूं। मुझे लगता है कि क्वेरी पैराम अधिक लचीला है। यहाँ सबसे अच्छा अभ्यास क्या है?
संपादित करें:
जबकि @LeftyX द्वारा जवाब शोध, लगता है जैसे मैं एक जवाब मिल गया है। Professional ASP.NET MVC 3 में अपने रूटिंग अध्याय (नामित रास्तों, अध्याय 9, पेज 233) से पी Haack के शब्दों में:
... अपने सभी मार्गों के लिए उपयोग नाम और हमेशा मार्ग नाम जब यूआरएल पैदा करने का उपयोग । अधिकांश समय, रूटिंग को सॉर्ट करना जो रूट यूआरएल उत्पन्न करने के लिए उपयोग करना चाहते हैं, वास्तव में इसे मौका छोड़ रहा है, जो कुछ नहीं है जुनूनी-बाध्यकारी नियंत्रण सनकी डेवलपर के साथ अच्छी तरह से बैठता है। एक यूआरएल उत्पन्न करते समय, आप आम तौर पर जानते हैं कि आप किस मार्ग से लिंक करना चाहते हैं, ताकि आप इसे नाम से भी निर्दिष्ट कर सकें।
उल्लिखित अनुभाग में वर्णित एक के लिए एक समान स्थिति पर चर्चा की गई है।
लेकिन Html.ActionLink()
के पास रूट नाम पैरामीटर के साथ अधिभार नहीं है, इसका मतलब यह है कि यदि इस तरह का मार्ग है तो मैं पूरे ऐप में कहीं भी इसका उपयोग नहीं कर सकता?
आपके उत्तर के लिए धन्यवाद। आपने वहां क्या किया वह मैने देखा। चूंकि आपने {id} पैरामीटर जोड़ा है, इसलिए {id} के लिए कोई मान प्रदान किए बिना रूटआउट लिंक (कॉल} अब मार्ग से मेल नहीं खाता है। हालांकि, आईडी पैरामीटर निर्दिष्ट करते समय एक मार्ग उत्पन्न करना इस मार्ग से मेल खाता है। यह: @ एचटीएमएल.एक्शनलिंक ("पृष्ठ 1", "पृष्ठ", "होम", नया {आईडी = 1}, शून्य) यह उत्पन्न करेगा: http: // localhost: 49 910/रिपोर्ट/1? कार्रवाई = पेज और नियंत्रक = होम जो आप उम्मीद नहीं करेंगे, है ना? –
@ghostskunks: मुझे पता है। मुझे डर है कि आपको वेबफॉर्म के लिए अपने लिंक जेनरेट करने के लिए रूटलिंक का उपयोग करना होगा या आप एक्शनलिंक को विस्तारित करने का प्रयास कर सकते हैं। – LeftyX
@ghostskunks: मैंने कुछ एक साथ (अद्यतन उत्तर) डालने की कोशिश की है, लेकिन जैसा कि मैंने कहा, मैं एक विशेषज्ञ नहीं हूं। यह सिर्फ एक विचार है। – LeftyX