2017-09-25 12 views
5

के साथ सभी क्षेत्रों को कैसे पकड़ें मैं एमवीसी के लिए नया हूं और मौजूदा एप्लिकेशन को संपादित कर रहा हूं।MapRoute

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

     routes.MapRoute(
      "Util", 
      "util/{action}", 
      new {controller = "util"}); 

     routes.MapRoute(
      "Catchall", 
      "{*url}", 
      new {controller = "Main", action = "CatchUrl"}); 
    } 
} 

अंदर मुख्य नियंत्रक है कि मूल रूप से एक RedirectToRoute करता है पर तर्क है और क्षेत्र, नियंत्रक, कार्रवाई करता है और एक निश्चित मूल्य के लिए location बुलाया क्वेरी स्ट्रिंग: वर्तमान में मैं RouteConfig.cs में निम्न देखें।

public class MainController : Controller 
{ 
    public ActionResult CatchUrl() 
    { 
     var agencyId = 9; 

     var routeValues = new RouteValueDictionary 
     { 
      {"area", "area1"}, 
      {"controller", "dashboard"}, 
      {"action", "index"}, 
      {"location", "testLocation"} 
     }; 

     return RedirectToRoute(routeValues); 
    } 
} 

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

public abstract class CustomAreaRegistration : AreaRegistration 
{ 
    public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      AreaName + "Ajax", 
      AreaName + "/{controller}/{action}", 
      new { action = "Index" } 
     ); 

     context.MapRoute(
      AreaName + "ShortUrl", 
      AreaName + "/{controller}", 
      new {action = "Index"} 
      ); 
    } 
} 

:

मैं भी एक फ़ाइल बुलाया CustomAreaRegistration.cs देखते हैं।

इसके अलावा, मैं इसे पाने के लिए इतना है कि जब आप

/{area}/ यह कुछ तर्क करता है और सही नियंत्रक से आप redircts जाएँ कोशिश कर रहा हूँ।

routes.MapRoute(
     "AreaIndex", 
     "{module}/", 
     new {controller = "Main", action = "Index"}); 

MainController:

public class MainController : Controller 
{ 
    public ActionResult Index() 
    { 
     var requestHost = HttpContext.Request.Url?.Host; 
     var location= requestHost == "localhost" ? Request.QueryString["location"] : requestHost?.Split('.')[0]; 


     var routeValues = new RouteValueDictionary 
     { 
      {"area", ControllerContext.RouteData.Values["module"]}, 
      {"controller", "dashboard"}, 
      {"action", "index"}, 
      {"location", location} 
     }; 

     return RedirectToRoute(routeValues); 
    } 

    public ActionResult CatchUrl() 
    { 
     var routeValues = new RouteValueDictionary 
     { 
      {"area", "area1"}, 
      {"controller", "dashboard"}, 
      {"action", "index"}, 
      {"location", "testLocation"} 
     }; 

     return RedirectToRoute(routeValues); 
    } 
} 

और मैं मार्ग तालिका में

कोई मार्ग नहीं मिल आपूर्ति किए गए मान से मेल खाता कैसे काम करता है CatchUrl

मेरे प्रयास करने के लिए इसी तरह की।

मुझे यकीन नहीं है कि क्यों CatchUrl काम करता है और मेरा नहीं।

+0

कैच-सब का प्रासंगिक हिस्सा वाइल्डकार्ड घटक '{* url} 'लगता है और मुझे आपके' {मॉड्यूल}/'मार्ग में कुछ भी दिखाई नहीं देता है। शायद संबंधित जानकारी के लिए निम्न पर एक नज़र डालें: https://stackoverflow.com/questions/7515644/infinite-url-parameters-for-asp-net-mvc-route – grek40

उत्तर

0

मैं वास्तव में आप क्या कह रहे हैं नहीं मिलता है, लेकिन सिर्फ कोड को देखकर, कि/बनाने MVC 3,4 में Areas उपयोग करने के लिए मानक तरीका और 5

आप नहीं करना चाहिए नहीं है प्रत्येक नियंत्रक के अंदर तर्क लिखने और रीडायरेक्ट करने की आवश्यकता है।

मेरे RouteConfig में, मेरे पास आमतौर पर डिफ़ॉल्ट रूट मैपिंग होता है। और जब आपके पास क्षेत्र की ज़रूरत है, तो आप विजुअल स्टूडियो में एमवीसी वेब प्रोजेक्ट पर राइट क्लिक कर सकते हैं और 'एड -> एरिया' पर क्लिक कर सकते हैं। यह वेब प्रोजेक्ट की जड़ के नीचे एक एरिया फ़ोल्डर के अंदर क्षेत्र के नाम के साथ एक फ़ोल्डर बना देगा। और क्षेत्र फ़ोल्डर के भीतर, आपको क्षेत्र के नाम और मैपिंग के लिए AreaRegistration.cs मिलना चाहिए।

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

     routes.MapRoute(
      name: "default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "dashboard", action = "index", id = UrlParameter.Optional }, 
      namespaces: new[] { "Company.Project.Web.UI.Controllers" } 
     ); 
    } 
} 

और मान लीजिए कि आप एक क्षेत्र 'व्यवस्थापक' कहा जाता है का निर्माण करना चाहते हैं:

public class AdminAreaRegistration : AreaRegistration 
{ 
    public override string AreaName 
    { 
     get 
     { 
      return "admin"; 
     } 
    } 

    public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      "admin_default", 
      "admin/{controller}/{action}/{id}", 
      new { action = "index", id = UrlParameter.Optional }, 
      namespaces: new[] { "Company.Project.Web.UI.Areas.Admin.Controllers" } 
     ); 
    } 
} 

अन्त में, मुझे लगता है कि एक स्क्रीनशॉट उपयोगी हो सकता है। enter image description here

- अपडेट -

टिप्पणियों के आधार पर, आप एप्पल नियंत्रक और उसके मुख विधि में जाने के लिए है, जबकि मार्ग /orange?location=dashbard ऑरेंज नियंत्रक और उसके डैशबोर्ड पर जाने के लिए मार्ग /apple?location=home चाहते हैं विधि, RouteConfig में एक मार्ग को परिभाषित करना बेहतर है।

आदर्श रूप में आप आप RouteConfig में कुछ इस तरह हो सकता है चाहते हैं:

 routes.MapRoute(
      name: "Area-CatchAll", 
      url: "{area}?location={controller}" 
     ); 

लेकिन वह संभव के रूप में MVC "कह मार्ग URL के साथ एक '/' या '~' चरित्र और शुरू नहीं कर सकते बाहर त्रुटि नहीं है इसमें '?' नहीं हो सकता चरित्र। "।

इसके बजाए, आप यातायात को नियंत्रक को निर्देशित कर सकते हैं और आप क्षेत्र और स्थान को पैरामीटर के रूप में परिभाषित कर सकते हैं।

routes.MapRoute(
    name: "Area-CatchAll", 
    url: "{area}", 
    defaults: new { controller = "Area", action = "Translate" } 
); 

public class AreaController : Controller 
{ 
    // The {area} from route template will be mapped to this area parameter. 
    // The location query string will be mapped to this location parameter. 

    public ActionResult Translate(string area, string location) 
    { 
     // This also assumes you have defined "index" method and 
     // "dashboard" controller in each area. 

     if (String.IsNullOrEmpty(location)) 
     { 
      location = "dashboard"; 
     } 
     return RedirectToAction("index", location, new { area = area }); 
    } 
} 

फिर से, मैं, क्षेत्रों के लिए यातायात पुनर्निर्देशित करना अगर मैं की जरूरत नहीं है कि ऐसा मार्ग नहीं बनाता।

+0

मेरे पास पहले से ही क्षेत्र काम कर रहे हैं। मैं चाहता हूं कि – CuriousDeveloper

+0

मुझे संपादित न करने दें: मेरे पास पहले से ही क्षेत्र काम कर रहे हैं। मैं पकड़ने के लिए '/ क्षेत्र /' चाहता हूं-सभी नियंत्रक की तरह जो यह पता लगाने का मौका देता है कि उन्हें किस नियंत्रक को जाना चाहिए। प्रत्येक क्षेत्र में दो मुख्य नियंत्रक, डैशबोर्ड और विवरण होते हैं। इसके बजाय एक विशिष्ट व्यक्ति डैशबोर्ड या विवरण प्राप्त करता है '/ क्षेत्र/' '/Apple /? Location = foo'' ऐप्पल 'क्षेत्र और डैशबोर्ड नियंत्रक और '/ Apple /? स्थान पर भेजा जाएगा प्राप्त पैरामीटर पर निर्भर करता है = बार' 'ऐप्पल' क्षेत्र और विस्तार नियंत्रक के पास जाएगा। बस एक उदाहरण के रूप में। – CuriousDeveloper

+1

आप इसके लिए अभी मार्ग बना सकते थे। इस – Raphael

0

मैं इतना है कि जब आप

/{क्षेत्र} पर इसे पाने के लिए कोशिश कर रहा हूँ/यह कुछ तर्क करता है और सही नियंत्रक से आप redircts। CatchUrl कैसे काम करता है

सबसे पहले, इस बारे में स्पष्ट होने दें। कैच-ऑल रूट रूटिंग यह रीडायरेक्ट कर रहा है। यह ब्राउज़र पर HTTP 302 प्रतिक्रिया जारी कर रहा है, जो ब्राउज़र को आपके सर्वर पर एक नया स्थान देखने के लिए कहता है। इस तरह की चीज बहुत कुशल नहीं है क्योंकि इसे नेटवर्क पर एक अतिरिक्त राउंड ट्रिप की आवश्यकता होती है, लेकिन ब्राउज़र में URL को सर्वर पक्ष से बदलने का यही एकमात्र तरीका है (यदि आप यही करना चाहते हैं)।

रूटिंग, दूसरे हाथ पर, प्रारंभिक अनुरोध सीधे किसी विशिष्ट संसाधन (नियंत्रक कार्रवाई) के लिए नेटवर्क के पार और ब्राउज़र का URL बदले बिना अतिरिक्त राउंड ट्रिप के बिना ले जा रहा है और यह भेज रहा है

public abstract class CustomAreaRegistration : AreaRegistration 
{ 
    public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      AreaName + "Ajax", 
      AreaName + "/{controller}/{action}", 
      new { action = "Index" } 
     ); 

     context.MapRoute(
      AreaName + "ShortUrl", 
      AreaName + "/{controller}", 
      new {action = "Index"} 
     ); 
    } 
} 

(यह मानते हुए कि प्रत्येक क्षेत्र है कि AreaName सेट के लिए इस का एक उपवर्ग है):

आपका मार्गों पहले से ही सही नियंत्रक यहाँ करने के लिए रूट करने के लिए

/Area/Controller 

उपयोग करने के लिए सेटअप कर रहे हैं।

आप वास्तव में मार्ग चाहते हैं (रीडायरेक्ट नहीं) इसी क्षेत्र में DashboardController.Index विधि के लिए /module/ यूआरएल, आप controller वैकल्पिक बनाने के लिए और यह DashboardController के लिए डिफ़ॉल्ट करने के लिए अपने ShortUrl बदल जाते हैं।

public abstract class CustomAreaRegistration : AreaRegistration 
{ 
    public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      AreaName + "Ajax", 
      AreaName + "/{controller}/{action}", 
      new { action = "Index" } 
     ); 

     context.MapRoute(
      AreaName + "ShortUrl", 
      AreaName + "/{controller}", 
      new { controller = "Dashboard", action = "Index" } 
     ); 
    } 
} 

यह फू क्षेत्र के DashboardController.Index विधि करने के लिए यूआरएल /Foo/ भेजने के लिए, लेकिन फू क्षेत्र के BarController.Index विधि करने के लिए यूआरएल /Foo/Bar/ भेज देंगे।

ऊपर मानता है कि आप पर्याप्त मेहनती सुनिश्चित करने के लिए अपने AreaName रों कि कोई भी अपनी परियोजना के गैर क्षेत्र के हिस्से में नियंत्रक के नाम के रूप में ही कर रहे हैं। यदि वे हैं, तो आप कभी भी उन गैर-क्षेत्र नियंत्रकों तक पहुंचने में सक्षम नहीं होंगे, बिना किसी अतिरिक्त कॉन्फ़िगरेशन के अतिरिक्त कॉन्फ़्रेंस।

MainController.Index विधि बिल्कुल आवश्यक नहीं है (जब तक आपके पास कुछ विशिष्ट कारण नहीं है कि आप ब्राउज़र में यूआरएल क्यों बदलना चाहते हैं)।

+0

मेरे पास पहले से ही क्षेत्र काम कर रहे हैं। मैं पकड़ने के लिए '/ क्षेत्र /' चाहता हूं-सभी नियंत्रक की तरह जो यह पता लगाने का मौका देता है कि उन्हें किस नियंत्रक को जाना चाहिए। प्रत्येक क्षेत्र में दो मुख्य नियंत्रक, डैशबोर्ड और विवरण होते हैं। इसके बजाय एक विशिष्ट व्यक्ति डैशबोर्ड या विवरण प्राप्त करता है '/ क्षेत्र/' '/Apple /? Location = foo'' ऐप्पल 'क्षेत्र और डैशबोर्ड नियंत्रक और '/ Apple /? स्थान पर भेजा जाएगा प्राप्त पैरामीटर पर निर्भर करता है = बार' 'ऐप्पल' क्षेत्र और विस्तार नियंत्रक के पास जाएगा। बस एक उदाहरण के रूप में। – CuriousDeveloper

+0

तो क्यों न केवल पुनर्निर्देशन के बजाय सीधे मार्ग पर जाएं? क्या आपको कुछ कारणों से '/ Apple/foo' में बदलने के लिए'/Apple /? Location = foo' की आवश्यकता है? – NightOwl888

+0

'location =' कुछ उपयोगकर्ता पहचानकर्ता के लिए धारक था, जहां यह किसी स्प्लैश स्क्रीन पर रीडायरेक्ट करता है या उस उपयोगकर्ता के लिए डीबी में संग्रहीत संपत्ति के आधार पर नहीं। तो यह प्रति नियंत्रक को इंगित नहीं करता है, लेकिन कुछ ऐसा करने के लिए जिसका उपयोग नियंत्रक को – CuriousDeveloper

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