আমি কীভাবে এএসপি.নেট এমভিসিতে ছোট ছোট রুট রাখতে পারি?


145

এএসপি.নেট এমভিসিতে আমি কীভাবে ছোট হাতের সংযোগ, প্লাস আন্ডারস্কোর, সম্ভব? যাতে আমি /dinners/details/2কল করব DinnersController.Details(2)এবং যদি সম্ভব হয় তবে /dinners/more_details/2ফোন করব DinnersController.MoreDetails(2)?

এই সব এখনও যেমন নিদর্শন ব্যবহার করার সময় {controller}/{action}/{id}


আমি আমার সমস্ত রুট বিভিন্নভাবে ম্যানুয়ালি লিখতে পেরেছি এবং আমি মনে করি যে কেবল CRUD নয় এমন কিছু দিয়ে তা করা এড়ানো কঠিন avoid তাই আমি কেবল তাদের ছোট হাতের অক্ষরে লিখেছি।
pupeno

ওয়েব ফর্ম ব্যবহার করছেন ? এখানে যান: এমএসডিএন.মাইক্রোসফটকম / en-us / library/… । (আমি ধীরে ধীরে আমার প্রকল্পকে ওয়েব ফর্মগুলি থেকে এমভিসিতে রূপান্তর করছি এবং প্রকল্পে উভয়ই রেখেছি)
জেস

আমি নিশ্চিত যে আপনি এটি ডিফল্ট হিসাবে করতে পারেন

আপনি যদি ছোট বা উচ্চতর ক্ষেত্রে রুটগুলি টাইপ করেন তবে তা বিবেচ্য নয়।

উত্তর:


238

System.Web.Routing 4.5 এর সাহায্যে আপনি রুট কালেকশনের লোয়ারকেসআরলস সম্পত্তি সেট করে এটি সোজাভাবে প্রয়োগ করতে পারেন:

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

        routes.LowercaseUrls = true;

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }

এছাড়াও ধরে নিচ্ছেন যে এসইও কারণে আপনি এটি করছেন আপনি আগত ইউআরএলগুলি ছোট হাতের দিকে পুনর্নির্দেশ করতে চান (যেমনটি এই নিবন্ধটির লিঙ্কগুলির অনেকগুলিতে বলা হয়েছে)।

protected void Application_BeginRequest(object sender, EventArgs e)
{
  //You don't want to redirect on posts, or images/css/js
  bool isGet = HttpContext.Current.Request.RequestType.ToLowerInvariant().Contains("get");
  if (isGet && HttpContext.Current.Request.Url.AbsolutePath.Contains(".") == false)    
  {
     string lowercaseURL = (Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Authority + HttpContext.Current.Request.Url.AbsolutePath);
     if (Regex.IsMatch(lowercaseURL, @"[A-Z]"))
     {
      //You don't want to change casing on query strings
      lowercaseURL = lowercaseURL.ToLower() + HttpContext.Current.Request.Url.Query;

      Response.Clear();
      Response.Status = "301 Moved Permanently";
      Response.AddHeader("Location", lowercaseURL); 
      Response.End();
    }
 }
}

4
এটি এখন পর্যন্ত 4.0.0 এ করা সবচেয়ে সহজ কাজ।
পল টার্নার

1
যদি এগুলি শীর্ষে থাকত ... প্রায় কার্গো-প্রচুর কোডযুক্ত!
আকাতাক্রিটোস

2
দুর্দান্ত উত্তর :-) উত্তরোত্তর এসইও অংশটি এইচটিটিপি মডিউলে সুন্দরভাবে ফিট করে।
ডেভিড কার্কল্যান্ড

1
অ্যারন শেরম্যান @ অ্যাপ্লিকেশন_বেগিনআরয়েস্ট অংশটি কোথায় যাওয়ার প্রস্তাব করা হয়েছে? এটি আমার ত্রুটিগুলি দিচ্ছে যখন এটির সর্বজনীন শ্রেণির রুটকনফিগের ভিতরে এবং এর বাইরে থাকলে।
রিচার্ড মিয়েনেক

1
@ রিচার্ড-মিয়েনাক এটিকে গ্লোবাল.এক্সএক্স ফাইলটিতে যুক্ত করুন
আইটিমেজ

44

এই দুটি টিউটোরিয়াল সাহায্য করেছিল যখন আমি একই জিনিসটি করতে এবং ভালভাবে কাজ করতে চেয়েছিলাম:

http: //www.coderj Journal.com/2008/03/force-mvc-route-url-lowercase/ http://goneale.com/2008/12/19/lowercase-route-urls-in-aspnet-mvc/

সম্পাদনা: অঞ্চলগুলি সহ প্রকল্পগুলির জন্য, আপনাকে getVirtualPath () পদ্ধতিটি পরিবর্তন করতে হবে:

public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
  var lowerCaseValues = new RouteValueDictionary();

  foreach (var v in values)
  {
    switch (v.Key.ToUpperInvariant())
    {
      case "ACTION":
      case "AREA":
      case "CONTROLLER":
        lowerCaseValues.Add(v.Key, ((string)v.Value).ToLowerInvariant());
        break;
      default:
        lowerCaseValues.Add(v.Key.ToLowerInvariant(), v.Value);
        break;
    }
  }
  return base.GetVirtualPath(requestContext, lowerCaseValues);
}

9
গনিয়েলের লিঙ্ক পরিবর্তন হয়েছে; ইউআরএল এখন goale.com/2008/12/19/lowercase-route-urls-in-aspnet-mvc
ড্যানিয়েল লিউজি

4
@ ডেরেক - না, এরিয়া ব্যবহার করার সময় টিউটোরিয়ালগুলি ভেঙে যায়। 3 দিন সমস্ত চেষ্টা করার পরে ... আমি একটি আরও ভাল সমাধান পেয়েছি, সেখানে অ্যাট্রিবিউট রাউটিং নামে একটি গ্রন্থাগার রয়েছে। সমস্যা সমাধান করে এবং জীবনকে অনেক সহজ করে তোলে। philliphaydon.com/2011/08/…
ফিল করুন

6
এমভিসি 4 এর জন্য সম্পত্তি রুটগুলি ব্যবহার করে আরও ভাল সমাধান রয়েছে ower Dhuvelle.com/2012/11/tips-for-aspnet-mvc-4-lowercase-urls.html- এ
মার্ক

4
আপনার ওয়েবসাইটটি কী হয়েছে? দ্বিতীয় লিঙ্কটি এখন মারা গেছে! যদিও আমাকে হাসিয়ে দিয়েছে, শিরোনামটি " ইন্টারনেটে বেস্ট গে আলে সাইট"
লুক 13

2
@ Chteuchteu এই লিঙ্কটি আমার পক্ষে কাজ করে না, তবে এইটি কার্যকর হয়েছিল
চিউ x x

22

আপনি ASP.NET কোর ব্যবহার করতে ঘটেছে, তাহলে হয়ত কটাক্ষপাত থাকা উচিত এই :

ক্লাসের ConfigureServicesপদ্ধতিতে নিম্নলিখিত লাইনটি যুক্ত করুন Startup

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

1
কোর 2.0 এর জন্য একই। এছাড়াও stackoverflow.com/a/45777372/195755
yzorg

21

আপনি যদি লিঙ্কটি তৈরি করতে UrlHelper ব্যবহার করে থাকেন তবে আপনি কেবলমাত্র ক্রিয়াটির নাম এবং কন্ট্রোলারটিকে ছোট হাতের মতো উল্লেখ করতে পারেন:

itemDelete.NavigateUrl = Url.Action("delete", "photos", new { key = item.Key });

ফলাফলগুলি: / মিডিয়া / ফটো / মুছুন / 64৪ (যদিও আমার নিয়ামক এবং ক্রিয়াটি পাস্কেল কেস)।


16
আমি মনে করি এই কাজটি একটি কেন্দ্রীয় অবস্থানে করা সবচেয়ে সহজ এবং সর্বাধিক মান সমাধান। এটি ইনলাইন সিএসএসের মতোই খারাপ। (দৃশ্যত 15 জন ইনলাইন সিএসএস ব্যবহার করে)।
মাফিন ম্যান

লিনাক্স সার্ভারের ক্ষেত্রেও কি এটি সত্য?
কিউমাস্টার

15

আমি নিক বেরার্ডির কোডার জার্নালে এটি পেয়েছি , তবে LowercaseRouteক্লাসটি কীভাবে প্রয়োগ করা যায় সে সম্পর্কে কোনও তথ্য ছিল না । অতএব অতিরিক্ত তথ্য সহ এখানে পুনরায় পোস্ট করা।

প্রথমে Routeক্লাসটি প্রসারিত করুনLowercaseRoute

public class LowercaseRoute : Route
{
    public LowercaseRoute(string url, IRouteHandler routeHandler)
        : base(url, routeHandler) { }
    public LowercaseRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler)
        : base(url, defaults, routeHandler) { }
    public LowercaseRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler)
        : base(url, defaults, constraints, routeHandler) { }
    public LowercaseRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, RouteValueDictionary dataTokens, IRouteHandler routeHandler) : base(url, defaults, constraints, dataTokens, routeHandler) { }
    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        VirtualPathData path = base.GetVirtualPath(requestContext, values);

        if (path != null)
            path.VirtualPath = path.VirtualPath.ToLowerInvariant();

        return path;
    }
}

তারপরে RegisterRoutesGlobal.asax.cs এর পদ্ধতিটি পরিবর্তন করুন

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

    routes.Add(new LowercaseRoute("{controller}/{action}/{id}", 
        new RouteValueDictionary(new { controller = "Home", action = "Index", id = "" }), 
        new MvcRouteHandler()));

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

আমি তবে রুটগুলি ব্যবহার করার একটি উপায় জানতে চাই M ম্যাপরোউট ...


গোনেলের নিবন্ধটি একটি এক্সটেনশন পদ্ধতি সরবরাহ করে যাতে আপনি লিখতে পারেন routes.MapRouteLowercase(...যা উপরের চেয়ে ভাল: goale.wordpress.com/2008/12/19/…
ড্রু নোকস

1
গোনেলের পুরো ব্লগ অদৃশ্য হয়ে গেছে। অনুরূপ সামগ্রী (এবং একই এক্সটেনশন পদ্ধতি) সহ অন্য একটি ব্লগ এন্ট্রি এখানে । এটি সদৃশ সামগ্রী হ্রাস করার প্রসঙ্গে এই পরিস্থিতিকে সম্বোধন করে।
পৃষ্ঠপোষক

11

আপনি এই ক্লাসটিকে রুটকলেকশনে এক্সটেনশন হিসাবে যুক্ত করে ম্যাপরোট সিনট্যাক্স ব্যবহার চালিয়ে যেতে পারেন:

public static class RouteCollectionExtension
{
    public static Route MapRouteLowerCase(this RouteCollection routes, string name, string url, object defaults)
    {
        return routes.MapRouteLowerCase(name, url, defaults, null);
    }

    public static Route MapRouteLowerCase(this RouteCollection routes, string name, string url, object defaults, object constraints)
    {
        Route route = new LowercaseRoute(url, new MvcRouteHandler())
        {
            Defaults = new RouteValueDictionary(defaults),
            Constraints = new RouteValueDictionary(constraints)
        };

        routes.Add(name, route);

        return route;
    }
}

এখন আপনি আপনার অ্যাপ্লিকেশনটির শুরুতে "ম্যাপরোট" এর পরিবর্তে "ম্যাপরোটলওয়ারক্যাস" ব্যবহার করতে পারেন:

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

        // Url shortcuts
        routes.MapRouteLowerCase("Home", "", new { controller = "Home", action = "Index" });
        routes.MapRouteLowerCase("Login", "login", new { controller = "Account", action = "Login" });
        routes.MapRouteLowerCase("Logout", "logout", new { controller = "Account", action = "Logout" });

        routes.MapRouteLowerCase(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );
    }

যে কারও এটি পড়ার জন্য, LowercaseRouteউপরের প্রথম কোড স্নিপেটে শ্রেণিটি এই অন্য উত্তর
চিউ x

6

এর আসলে দুটি উত্তর রয়েছে:

  1. আপনি ইতিমধ্যে এটি করতে পারেন: রুট ইঞ্জিনটি কেস-সংবেদনশীল তুলনা করে। যদি আপনি একটি ছোট-কেস রুট টাইপ করেন তবে এটি যথাযথ নিয়ামক এবং ক্রিয়াতে স্থানান্তরিত হবে।
  2. যদি আপনি নিয়ন্ত্রণ ব্যবহার করে যা রুট লিঙ্কগুলি তৈরি করে (অ্যাকশনলিঙ্ক, রাউট লিঙ্ক, ইত্যাদি) আপনি এই ডিফল্ট আচরণকে ওভাররাইড না করে তারা মিশ্র-কেস লিঙ্কগুলি তৈরি করবেন।

আন্ডারস্কোরগুলির জন্য আপনি নিজেরাই রয়েছেন, যদিও ...


2

আপনি অ্যাকশননাম অ্যাট্রিবিউটটি ব্যবহার করতে পারবেন?

 [ActionName("more_details")]
 public ActionResult MoreDetails(int? page)
 {

 }

আমি মামলার বিষয় মনে করি না। ইউআরএল-এ আরও_ বিবরণ, আরও_ডেটাইলস, এমওআর_আর। ডেটা টেলসগুলি আপনাকে একই নিয়ন্ত্রণকারী অ্যাকশনে নিয়ে যায়।


আমি চেষ্টা করে দেখিনি - এটি আপনাকে একটি ব্যবহার করতে দেবে? ("মোরডিটেলস" বা "আরও_র বিবরণ")
গ্যালাকটিক

অনুসরণ করার জন্য, আমি এটি চেষ্টা করেছি এবং এটির জন্য আপনাকে নির্দিষ্ট নামটি ব্যবহার করা দরকার, সুতরাং না, এটি আপনাকে এটি কোনওভাবেই পরিচালনা করতে দেয় না। এছাড়াও, আপনি কীভাবে আপনার কন্ট্রোলার অ্যাকশন এবং দর্শনটি তৈরি করেছেন তার উপর নির্ভর করে আপনার স্পষ্টভাবে ভিউটির নাম উল্লেখ করতে হবে।
গ্যালাকটিক কাউবয়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.