2012-03-01 14 views
6

मैं एएसपी.नेट एमवीसी 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() के पास रूट नाम पैरामीटर के साथ अधिभार नहीं है, इसका मतलब यह है कि यदि इस तरह का मार्ग है तो मैं पूरे ऐप में कहीं भी इसका उपयोग नहीं कर सकता?

उत्तर

1

यह सबसे अच्छा समाधान है जिसे मैंने पाया है।
मैं साथ MapPageRoute

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapPageRoute(
      "report-rendering", 
      "Report/{id}", 
      "~/Reports/Report.aspx" 
     ); 

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

मैं अपने लिंक RouteLink उपयोग कर बनाई गई है, ताकि आप मार्ग का उपयोग करने के लिए निर्दिष्ट कर सकते हैं (मैं एक फ़ोल्डर रिपोर्ट कहा जाता है के तहत मेरी रिपोर्ट पेज रख दिया है) मेरे मार्ग पंजीकृत कर लिया है:

@Html.RouteLink("Report list", "report-rendering", new { id = 7 }) 

और मैं इस तरह मेरी वेबफ़ॉर्म पेज में आईडी प्राप्त कर सकते हैं:

protected void Page_Load(object sender, EventArgs e) 
{ 
    var id = Page.RouteData.Values["id"] as string; 
} 

उम्मीद है कि यह मदद करता है।

अद्यतन:

मैं एक एक्सटेंशन विधि बना लिया है अपने जीवन को आसान बनाने के लिए:

public static class ExtensionMethods 
{ 
    public static MvcHtmlString WebFormActionLink(this HtmlHelper htmlHelper, string linkText, string ruoteName, object routeValues) 
    { 
     var helper = new UrlHelper(htmlHelper.ViewContext.RequestContext); 

     var anchor = new TagBuilder("a"); 
     anchor.Attributes["href"] = helper.RouteUrl(routeName, routeValues); 
     anchor.SetInnerText(linkText); 
     return MvcHtmlString.Create(anchor.ToString()); 
    } 
} 

सबसे अच्छा ActionLink बजाय उपयोग करने के लिए हो गया होता WebFormActionLink लेकिन मेरे पास है हस्ताक्षर के साथ समस्याएं और मैं इस पर एक विशेषज्ञ नहीं हूं।

+0

आपके उत्तर के लिए धन्यवाद। आपने वहां क्या किया वह मैने देखा। चूंकि आपने {id} पैरामीटर जोड़ा है, इसलिए {id} के लिए कोई मान प्रदान किए बिना रूटआउट लिंक (कॉल} अब मार्ग से मेल नहीं खाता है। हालांकि, आईडी पैरामीटर निर्दिष्ट करते समय एक मार्ग उत्पन्न करना इस मार्ग से मेल खाता है। यह: @ एचटीएमएल.एक्शनलिंक ("पृष्ठ 1", "पृष्ठ", "होम", नया {आईडी = 1}, शून्य) यह उत्पन्न करेगा: http: // localhost: 49 910/रिपोर्ट/1? कार्रवाई = पेज और नियंत्रक = होम जो आप उम्मीद नहीं करेंगे, है ना? –

+0

@ghostskunks: मुझे पता है। मुझे डर है कि आपको वेबफॉर्म के लिए अपने लिंक जेनरेट करने के लिए रूटलिंक का उपयोग करना होगा या आप एक्शनलिंक को विस्तारित करने का प्रयास कर सकते हैं। – LeftyX

+0

@ghostskunks: मैंने कुछ एक साथ (अद्यतन उत्तर) डालने की कोशिश की है, लेकिन जैसा कि मैंने कहा, मैं एक विशेषज्ञ नहीं हूं। यह सिर्फ एक विचार है। – LeftyX

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