आप ASP.NET कोर में लोअरकेस रूटिंग को कैसे लागू करते हैं?


94

ASP.NET 4 में इस के रूप में आसान के रूप में था routes.LowercaseUrls = true;में RegisterRoutesअनुप्रयोग के लिए हैंडलर।

मैं इसे प्राप्त करने के लिए ASP.NET Core में समकक्ष नहीं ढूँढ सकता। मुझे लगता है कि यह यहाँ होगा:

app.UseMvc(configureRoutes =>
{
    configureRoutes.MapRoute("Default", "{controller=App}/{action=Index}/{id?}");
});

लेकिन configureRoutesइसे अनुमति देने के लिए कुछ भी नहीं दिखता है ... जब तक कि कहीं एक विस्तार विधि नहीं है जो मुझे डॉक्स में शायद नहीं मिल सकती है?

जवाबों:


202

ASP.NET कोर के लिए:

निम्न पंक्ति को कक्षा की ConfigureServicesविधि में जोड़ें Startup

services.AddRouting(options => options.LowercaseUrls = true);

टिप्पणी के रूप में उत्तर के लिए स्कोरुनका को धन्यवाद। मुझे लगा कि यह एक वास्तविक जवाब को बढ़ावा देने के लायक है।


35
यह ध्यान देने योग्य है कि आपको इस BEFORE को लगाना चाहिए जिसे आप वास्तव AddMvc()में अपनी Startup.ConfigureServices()विधि में कहते हैं । AddRouting()जिसे आपके सेवा संग्रह पर निर्भरता जोड़ने के लिए विधियों AddMvc()के Tryवेरिएंट का उपयोग करके भी बुलाया जाता है । इसलिए जब यह देखता है कि रूटिंग निर्भरता पहले ही जोड़ दी गई है, तो यह AddMvc()सेटअप तर्क के कुछ हिस्सों को छोड़ देगा ।
निक अल्ब्रेक्ट

यह सही जवाब के लिए स्विचिंग चूंकि खदान 4 से कोर के संक्रमण के दौरान मेरा था।
मारीचैच

@NickAlbrecht इससे पहले या बाद में (ASP.NET Core 5.0 के रूप में, कम से कम) कहा जाता है तो कोई फर्क नहीं पड़ता। AddRout () को वैसे भी दो बार बुलाया जाएगा, इसलिए यह किस क्रम में मायने नहीं रखता।
थॉमस लेवेस्क

मेरा मानना ​​है कि .NET कोर 3.x के आसपास किया गया था। उन्होंने इसे बदल दिया ताकि राउटिंग MVC के साथ बंडल के बजाय एक स्टैंड अलोन फीचर हो। मेरा मानना ​​है कि रूटिंग को AddMvc(या AddControllersWithViewsयदि आपको रेज़रपेज की आवश्यकता नहीं है) कहा जाता है । यदि आप AspNetCore 2 का उपयोग कर रहे हैं तो आदेश केवल वास्तव में मायने रखता है (यदि यह 1.x में एक विकल्प था तो याद न करें)। हालांकि वे किया था दो सेटिंग्स में लोअरकेस व्यवहार विभाजित है, इसलिए यदि आप पूरी तरह से छोटे अक्षर पतों चाहते हैं, आप स्थापित करने के लिए दोनों की जरूरत है LowercaseUrlsऔर LowercaseQueryStringsकरने के लिए true
निक अल्ब्रेक्ट

37

ASP.NET कोर वर्जन> = 2.2 में अपडेट करें

से ASP.NET कोर 2.2 , के साथ साथ लोअरकेस आप भी अपने कर सकते हैं मार्ग धराशायी का उपयोग कर ConstraintMapजो अपने मार्ग कर देगा /Employee/EmployeeDetails/1करने के लिए /employee/employee-details/1के बजाय /employee/employeedetails/1

ऐसा करने के लिए, पहले SlugifyParameterTransformerवर्ग का निर्माण निम्नानुसार होना चाहिए:

public class SlugifyParameterTransformer : IOutboundParameterTransformer
{
    public string TransformOutbound(object value)
    {
        // Slugify value
        return value == null ? null : Regex.Replace(value.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower();
    }
}

ASP.NET Core 2.2 MVC के लिए:

कक्षा की ConfigureServicesविधि में Startup:

services.AddRouting(option =>
{
    option.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer);
});

और मार्ग विन्यास निम्नानुसार होना चाहिए:

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

ASP.NET कोर 2.2 वेब एपीआई के लिए:

कक्षा की ConfigureServicesविधि में Startup:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options => 
    {
        options.Conventions.Add(new RouteTokenTransformerConvention(new SlugifyParameterTransformer()));
    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

ASP.NET कोर के लिए = = 3.0 MVC:

कक्षा की ConfigureServicesविधि में Startup:

services.AddRouting(option =>
{
    option.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer);
});

और मार्ग विन्यास निम्नानुसार होना चाहिए:

app.UseEndpoints(endpoints =>
{
      endpoints.MapAreaControllerRoute(
          name: "AdminAreaRoute",
          areaName: "Admin",
          pattern: "admin/{controller:slugify=Dashboard}/{action:slugify=Index}/{id:slugify?}");

      endpoints.MapControllerRoute(
          name: "default",
          pattern: "{controller:slugify}/{action:slugify}/{id:slugify?}",
          defaults: new { controller = "Home", action = "Index" });
});

ASP.NET कोर के लिए = = 3.0 वेब एपीआई:

कक्षा की ConfigureServicesविधि में Startup:

services.AddControllers(options => 
{
    options.Conventions.Add(new RouteTokenTransformerConvention(new SlugifyParameterTransformer()));
});

ASP.NET कोर के लिए = = 3.0 रेजर पेज:

कक्षा की ConfigureServicesविधि में Startup:

services.AddRazorPages(options => 
{
    options.Conventions.Add(new PageRouteTransformerConvention(new SlugifyParameterTransformer()));
})

इससे /Employee/EmployeeDetails/1मार्ग बन जाएगा/employee/employee-details/1


मैंने इस कोड और आधिकारिक Microsoft कोड को भी आज़माया, लेकिन "slugify" पैरामीटर ट्रांसफार्मर का कोई प्रभाव नहीं है। इसे केवल रूटिंग सिस्टम द्वारा अनदेखा किया जाता है (इसलिए URL को धराशायी करने के लिए प्रतिस्थापित नहीं किया जाता है)। अपने आप को जांचने के लिए मैंने लकड़हारा को ट्रांसफॉर्मऑबाउंड () विधि में डाला, लेकिन वहां से कोई कॉल नहीं आया।
user3172616

ठीक है! कृपया मुझे जाँच करें!
तनवीरअर्जेल

@ user3172616 मैंने अभी इसकी जाँच की है! उम्मीद के मुताबिक काम कर रहा है! के रूप में मार्ग बनाने की तरह employee-details। क्या आप मुझे अपना विन्यास दिखाएंगे?
तनवीरअर्जेल

@ user3172616 क्या आप परीक्षण किए गए मार्ग पर विशेषता मार्ग का उपयोग कर रहे हैं?
तनवीरअर्जेल

मैं Visual Studio में ब्रांड नए कोर v2.2 समाधान पर मानक रूटिंग दृष्टिकोण (विशेषता रूटिंग नहीं) का उपयोग करता हूं। दो स्क्रीनशॉट हैं (c # कोड और .cshtml कोड)। मैंने बिना किसी प्रभाव के विभिन्न तरीकों से लिंक बनाने की कोशिश की। imgur.com/a/L8dCF6c
user3172616

21

जैसा कि अन्य उत्तर इंगित करते हैं, जोड़ना:

services.Configure<RouteOptions>(options => options.LowercaseUrls = true);

इससे पहले

services.AddMvc(...)

महान काम करता है, लेकिन मैं यह भी जोड़ना चाहता हूं कि यदि आप पहचान का उपयोग करते हैं, तो आपको भी आवश्यकता होगी:

services.AddIdentity<IdentityUser, IdentityRole>(options =>
{
    var appCookie = options.Cookies.ApplicationCookie;
    appCookie.LoginPath = appCookie.LoginPath.ToString().ToLowerInvariant();
    appCookie.LogoutPath = appCookie.LogoutPath.ToString().ToLowerInvariant();
    appCookie.ReturnUrlParameter = appCookie.ReturnUrlParameter.ToString().ToLowerInvariant();
});

और जाहिर है, यदि आवश्यक हो, तो दोनों IdentityUserको और IdentityRoleअपने स्वयं के वर्गों के साथ बदलें ।

मैंने इसे .NET कोर एसडीके 1.0.4 और 1.0.5 रनटाइम के साथ परीक्षण किया।


कॉन्फ़िगर करें <RouteOptions> () सबसे अच्छा उत्तर imho है: छोटे और सीधे बिंदु पर (mvc कोर 3.1 पर परीक्षण किया गया)
T-moty

12

समाधान मिल गया।

विधानसभा में: Microsoft.AspNet.Routingऔर Microsoft.Extensions.DependencyInjectionनेमस्पेस, आप अपनी ConfigureServices(IServiceCollection services)विधि में ऐसा कर सकते हैं :

services.ConfigureRouting(setupAction =>
{
    setupAction.LowercaseUrls = true;
});

15
ASP NET MVC कोर के लिए: services.AddRout (विकल्प => {विकल्प। लोवरकेस = पर्ल =});
स्कोरुनका फ्रांटिसेक

Microsoft.Extensions.D
dependencyInjection

3
RTM से पहले यह सच था, अब आपको इसका उपयोग करना चाहिए। इसके अलावा .ConfigureRout
Yves Schelpe

0

पहचान के लिए, @ जोर्ज येंस डाइज़ का उत्तर इसमें काम नहीं करता है ASP.NET Core 2.2( मुझे लगता है कि 2.x ), इसलिए यदि आप आइडेंटिटी और ASP.NET Core 2.2 (2.x) का उपयोग करते हैं तो समाधान है:

services.ConfigureApplicationCookie(options =>
{
    options.LoginPath = "/account/login";
    options.ReturnUrlParameter = "returnurl";
    ...
});

Ref: ASP.NET कोर पहचान कॉन्फ़िगर करें


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.