7

MapSpaFallbackRoute सशर्त स्थापना मैं एक परियोजना शामिल है जो एक से अधिक एकल पृष्ठ आवेदन एक भी नेट कोर 1.0 वेब अनुप्रयोग पर होस्ट कर रहे हैं कि विकासशील कर रहा हूँ।नेट कोर MVC रूटिंग: प्रति नियंत्रक

लक्ष्य प्रत्येक एसपीए विभाजन ताकि वे सभी अलग से मौजूद हैं, अपने स्वयं के दृश्य और नियंत्रक के साथ एक है।

स्टार्टअप सीएस में, माइक्रोसॉफ्ट.एस्पनेट कॉर। एसपी सर्विसेज मैपस्पाफॉलबैक रूट का उपयोग एसपीए के गहरे लिंक (इस मामले में कोणीय 2) को पार करने के लिए कर रहा है, इसलिए एमवीसी उलझन में नहीं आती है और पेज रीफ्रेश पर 404 फेंक देती है।

मैं एक समय में एक एसपीए के लिए काम कर रहा हूं जब मैं नियंत्रक मैन्युअल रूप से MapSpaFallbackRoute में सेट करता हूं, लेकिन मैं प्रत्येक एसपीए नियंत्रक के लिए इसे सशर्त रूप से सेट करने का तरीका नहीं समझ सकता।

मैं यह सोचते कर रहा हूँ जहाँ मैं करने की आवश्यकता है कि Mapwhen() और रन() का एक संयोजन मुझे मिल जाएगा, लेकिन मैं वाक्य रचना सही पाने के लिए नहीं कर पा रहे।

स्पा मान लिया जाये कि, 'Dash2', 'Dash1' नाम दिया गया है आदि निम्नलिखित फ़ॉलबैक मार्ग Dash1 के लिए पूरी तरह से काम करता है:

app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "default", 
       template: "{controller=Home}/{action=Index}/{id?}"); 

      routes.MapSpaFallbackRoute("spa-fallback", new { controller = "Dash1", action = "Index" }); 
     }); 

मैं इस की कोशिश की है:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 

     app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "default", 
       template: "{controller=Home}/{action=Index}/{id?}"); 
     }); 
     app.Map("/Dash1", HandleDash1); 

    } 

    private static void HandleDash1(IApplicationBuilder app) 
    { 
     app.UseMvc(routes => 
     { 
      routes.MapSpaFallbackRoute("spa-fallback", new { controller = "Dash1", action = "Index" }); 
     }); 
    } 
} 

.. लेकिन फिर जब मैं डैश 1 पर नेविगेट करता हूं और पृष्ठ को रीफ्रेश करने का प्रयास करता हूं, तो ब्राउज़र सभी http अनुरोधों में '/ Dash1 /' को प्रीपेड करता है और सब कुछ तोड़ देता है।

+0

पूरी तरह से अनुमान लगा रहा है, लेकिन आपने 'मार्गों .MapSpaFallbackRoute ("{नियंत्रक}/स्पा-फ़ॉलबैक", नया {action = "अनुक्रमणिका"}) की कोशिश की है;' आपके पहले दृष्टिकोण में? –

+0

मैंने इसे आज़माया लेकिन पेज रीफ्रेश पर अभी भी 404 मिल रहा है।पहला स्ट्रिंग पैरा सिर्फ मार्ग का नाम है, लेकिन ऐसा लगता है कि इसे ऐसा करना संभव होना चाहिए; बस वर्तमान नियंत्रक को फॉलबैक के रूप में पंजीकृत करें। – David

उत्तर

14

मैं इसे MapWhen() के साथ काम मिल गया है, लेकिन हर एसपीए इस तरह से पंजीकृत होना होगा।

app.MapWhen(context => context.Request.Path.Value.StartsWith("/Dash1"), builder => 
{ 
    builder.UseMvc(routes => 
    { 
     routes.MapSpaFallbackRoute("dash1-fallback", new { controller = "Dash1", action = "Index" }); 
    }); 
}); 

app.UseMvc(routes => 
{ 
    routes.MapRoute(
     name: "default", 
     template: "{controller=Home}/{action=Index}/{id?}"); 
}); 

मैं कोणीय (2+) ऐप्स होस्ट करने के लिए इस विधि का उपयोग कर रहा हूं। मैं मूल रूप से SystemJS का उपयोग कर रहा था और सभी प्रोजेक्ट को एक प्रोजेक्ट में रख रहा था, लेकिन संस्करण 4 जारी होने पर मैं एंगुलर सीएलआई में गया।

ऐप्स का प्रबंधन करने का सबसे अच्छा तरीका है प्रत्येक ऐप के समाधान में एक अलग परियोजना बनाना और "मास्टर" प्रोजेक्ट के wwwroot के अंदर एक फ़ोल्डर में बंडल फ़ाइलों की प्रतिलिपि बनाने के लिए एनपीएम स्क्रिप्ट का उपयोग करना।

बजाय एक दृश्य लौटने की, मैं सिर्फ CLI द्वारा बनाई स्थिर html फ़ाइल की सेवा कर रहा हूँ, लेकिन दृश्य भी ठीक काम करते हैं।

public IActionResult Index() 
{ 
    return PhysicalFile(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/dash1", "index.html"), "text/HTML"); 
} 

मुश्किल हिस्सा राउटर का प्रबंधन कर रहा है। वर्तमान नियंत्रक के मार्ग से मेल खाने के लिए आपको बेस href सेट करना होगा और विंडो ['_ app_base'] सेटिंग करके कोणीय राउटर को रूटिंग करना होगा।

<head> 
    // Set base href. 
    // You need to include the path if serving the static file from wwwroot 
    // Use '/' if using a View (I think, I had to change this when I switched to static files). 

    <base href="/dash1/"> 

    <script> 
     (function() { 
      // You could type the controller path here again but this will infer it. 

      window['_app_base'] = '/' + window.location.pathname.split('/')[1]; 

     })(); 
    </script> 
</head> 

फिर, कोणीय रूटर से window [ '_ app_base'] बीयरिंग है पाने के लिए है:

index.html में निम्नलिखित को शामिल करें।

import { NgModule, Provider } from '@angular/core'; 
import { APP_BASE_HREF, Location } from '@angular/common'; 
const baseHref: Provider = { 
    provide: APP_BASE_HREF, 
    useValue: window['_app_base'] || '/' 
}; 

अंत में, @NgModule के प्रदाताओं सरणी में baseHref को शामिल करें: app.module.ts में निम्नलिखित शामिल हैं।

+0

डेविड, मैं एक एएसपी.Net कोर एमवीसी अनुप्रयोग के भीतर अलग कोणीय 2 अनुप्रयोगों को बनाने के तरीके को समझने के लिए संघर्ष कर रहा हूं। क्या आप कृपया कुछ अंतर्दृष्टि प्रदान करने के इच्छुक होंगे? – TDC

+0

हाय टीडीसी। मैंने थोड़ी अधिक जानकारी के साथ पोस्ट को अपडेट किया। मैं वेबपैक के बजाय SystemJS का उपयोग कर रहा हूं, और वहां कई नई बिल्ड सुविधाएं उपलब्ध हैं जिन्हें मैंने अभी तक नहीं सीखा है। मैंने Nuget पर उपलब्ध नए कोणीय टेम्पलेट के बारे में आपका प्रश्न देखा, लेकिन यह विधि वेबपैक के साथ संगत नहीं है, इसलिए मैंने यहां यह जवाब अपडेट किया है। आशा करता हूँ की ये काम करेगा। – David

+0

स्पष्टीकरण के लिए डेविड धन्यवाद, सबसे सराहना की। मुझे यह समझने में कुछ समय बिताना होगा कि यह सब एक साथ कैसे फिट बैठता है। मैं तय नहीं कर सकता कि एएसपी.Net कोर के भीतर कोणीय को एकीकृत करना फायदेमंद या पूरी तरह से विचलित (विनम्र वाक्यांश) है। – TDC

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