7
द्वारा विभाजित

संभव डुप्लिकेट:
How do I register a controller that has been created in an AREAनियंत्रकों क्षेत्रों

मैं सवाल है - यह आगे क्या करना संभव है?

मैं तीन क्षेत्रों है:

_Default 
SiteOne 
SiteTwo 

प्रत्येक क्षेत्र मैं एक ही नाम के साथ एक ApiController है अंदर, लेकिन निश्चित रूप से अलग नामस्थान में:

MvcAppliaction.Areas._Default.Controllers.ValuesController 
MvcAppliaction.Areas.SiteOne.Controllers.ValuesController 
MvcAppliaction.Areas.SiteTwo.Controllers.ValuesController 

मैं भी (वर्तमान का मान होना जो मैं उपयोग करना चाहता हूं) विन्यास में क्षेत्र। ,

/api/values 

उदाहरण के लिए यदि कॉन्फ़िग फ़ाइल में वर्तमान क्षेत्र SiteOne है:

मैं उपयोगकर्ता को मैप करने के लिए उचित क्षेत्र (जो मैं विन्यास में पा सकते हैं) में नियंत्रक करने के लिए चाहते हैं कि क्या वह ब्राउज़र में प्रवेश करती है तो यह अनुरोध MvcAppliaction.Areas.SiteOne.Controllers.ValuesController नियंत्रक के लिए मैप किया जाना चाहिए, लेकिन अगर मैं कॉन्फ़िगरेशन फ़ाइल में वर्तमान क्षेत्र को _Default के SiteTwo में बदलता हूं तो इसे नियंत्रक को सही करने के लिए मैप किया जाना चाहिए।

पीएस। MVC नियंत्रक यह आसान है साथ, आप बस अपना मार्ग निर्धारित करने के लिए है:

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    namespaces: new[] { "MvcApplication.Web.Areas." + SiteName + ".Controllers") } 
); 

उत्तर

4

मेरा सुझाव एक कस्टम DefaultControllerFactory को लागू करना होगा।

आप एक बहुत अच्छा उदाहरण here

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

वह कार्यक्षमता देगा जो आप ढूंढ रहे हैं।

+0

धन्यवाद के साथ एक संघर्ष है। मैंने सोचा कि एक और तरीका है। तो, मैं HTTP नियंत्रक कारखाना लागू करेंगे। – Malkov

+0

मदद की कोई समस्या नहीं है – dmportella

12

बयान निम्नलिखित का उपयोग कर जोड़ने और अपने AreaRegistration.cs फ़ाइल में मार्ग पंजीकरण संशोधित करने का प्रयास।

using System.Web.Http; 
... 
public override void RegisterArea(AreaRegistrationContext context) 
{ 
     context.Routes.MapHttpRoute(
      name: this.AreaName, 
      routeTemplate: this.AreaName + "/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
} 
+0

नियंत्रकों आप लिखने के लिए _/siteone/values_ है तक पहुँचने के लिए, या _/sitetwo/values_। लेकिन मैं सिर्फ _/api/values_ लिखना चाहता हूं और उस क्षेत्र से नियंत्रक तक पहुंच प्राप्त करना जिसे मैंने कॉन्फ़िगरेशन फ़ाइल में कॉन्फ़िगर किया था। उदाहरण के लिए, यदि मैंने कॉन्फ़िगरेशन फ़ाइल में SiteOne निर्दिष्ट किया है और url _/api/values_ कहा जाता है तो मुझे साइटऑन एरिया से नियंत्रक मिल जाएगा, और यदि मैं कॉन्फ़िगरेशन फ़ाइल SiteTwo में क्षेत्र बदल दूंगा, तो यदि मैं _/api/values ​​/ मैं SiteTwo नियंत्रक मिल जाएगा। – Malkov

+0

मैं 'name: this.AreaName +" _API "का प्रस्ताव देना चाहता हूं या जो भी नामकरण सम्मेलन आपको उपयुक्त बनाता है - तो मार्ग का नाम केवल 'व्यवस्थापक' के बजाय' Admin_API' होगा। इसके अलावा मैंने 'रूट टेम्पलेट: "एपीआई /" + यह। एरियानाम + "/ {नियंत्रक}/{आईडी}" का उपयोग किया है, इसलिए मैं इसे'/api/admin/users/123' के साथ एक्सेस कर सकता हूं।अगर आपको 404 त्रुटियां मिलती हैं तो आपको शायद एक और सामान्य एमवीसी मार्ग –

7

I've created a post about how to implement the HttpControllerFactory to support Areas

और अब मैं सिर्फ क्षेत्र नाम MapHttpRoute में Global.asax फ़ाइल में निर्दिष्ट कर सकते हैं:

routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { area = configurationService.SiteName, id = RouteParameter.Optional } 
     ); 
इस मामले में
संबंधित मुद्दे