ASP.NET MVC - تعيين أكثر من معلمة سلسلة استعلام إلى عنوان url جميل

StackOverflow https://stackoverflow.com/questions/417000

  •  03-07-2019
  •  | 
  •  

سؤال

أنا عالق بعض الشيء في تصميم عناوين url الصديقة لمحركات البحث الخاصة بي لـ mvc.... خذ على سبيل المثال عنوان url التالي:http://myapp/venues/resturants.aspx?location=central&orderBy=top-rated

باستخدام تطبيق mvc الخاص بي، قمت بتعيينه على النحو التالي:http://myapp/venues/list/resturants/central/top-rated
{تحكم}/{إجراء}/{فئة}/{موقع}/{طلب}

المشكلة الوحيدة الآن هي أن الموقع والطلب اختياريان... لذا يجب أن يكون من الممكن إرسال طلب مثل: http://myapp/venues/list/resturants/top-rated .وقد ثبت أن هذا يمثل مشكلة عندما يصل الطلب إلى إجراء وحدة التحكم، وقد التقطت معلمة الموقع "الأعلى تقييمًا"، بطبيعة الحال.

أي اقتراحات؟أنا أفكر في استخدام سلاسل استعلام صريحة للتعامل مع أكثر من معلمة واحدة ولكن هذا هو خياري الأخير حقًا لأنني لا أريد التضحية كثيرًا بتحسين محركات البحث.

هل واجه أي شخص مثل هذه المعضلات؟وكيف تعاملت مع الأمر؟

شكرا لك مقدما!

هل كانت مفيدة؟

المحلول

وعلى افتراض أن القيم المسموح بها للموقع والنظام هي فريدة من نوعها (أي عندما يأتون في، يمكنك تمييزها عن بعضها البعض، وإلا إذا كانوا العرض فقط واحد، كيف أنت ذاهب لمعرفة ما اذا كان موقع أو أمر؟) ، ثم هل يمكن أن تأخذ فقط معلمتين والعمل على ما هي عليه في وحدة تحكم.

والطريق: {controller}/{action}/{param1}/{param2}

وعمل وحدة التحكم:

public ActionResult MyAction(string param1, string param2)
{
    string location;
    string order;
    if (!ParseLocation(param1, out location))
    { ParseLocation(param2, out location); }
    // ...
}

وليس أنيقة خاصة، ولكن لا تسمح لديك عناوين URL التي تريدها.

نصائح أخرى

انقر فوق الخاص بك رابط الملف الشخصي وانظر إلى عناوين URL الخاصة بالإحصائيات والحديثة والاستجابة وما إلى ذلك.

أمثلة:

مع عدم وجود نوع فإنه الافتراضي للإحصائيات

يجب أن تكون المعلمات الاختيارية معلمات الاستعلام

وسيكون لديك دائما هذه المسألة إذا كان لديك العديد من المعلمات الاختيارية. إما أن تجعل أحد أو كلا منهم غير اختياري (وضعه في سلسلة الاستعلام من اختياري واحد في وقت سابق) أو استخدام التدوين معلمة سلسلة استعلام مواقع المعلومات.

وطيب الرجال فقط نشر الحل لقد تم اللعب مع حتى الآن.

ولقد شكلت الطرق بي باستخدام القيود كما يلي:

        routes.MapRoute(
            "VenuesList",                                              
            "venues/list/{category}/{location}/{orderBy}",             
            new { controller = "venues", action = "list", category = "", location = "", orderBy = "" },
            new { location = "central|east|west|south", orderBy = "top-rated|price" }
        );

    routes.MapRoute(
            "VenuesListByLocation",                                              
            "venues/list/{category}/{location}",                           
            new { controller = "venues", action = "list", category = "", location = "" },
            new { location = "central|east|west|south" }
        );

        routes.MapRoute(
            "VenuesListByOrder",                                              
            "venues/list/{category}/{orderBy}",                           
            new { controller = "venues", action = "list", category = "", orderBy = "" },
            new { orderBy = "top-rated|price" }
        );

        routes.MapRoute(
            "VenuesListDefault",                                              
            "venues/list/{category}",                           
            new { controller = "venues", action = "list", category = "" }

        );

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

والفكرة هي أنه إذا فشل التحقق من الصحة وسوف تذهب إلى مسار التالي في القائمة ... في نهاية المطاف ضرب الافتراضي.

ويحتاج إلى مزيد من الاختبارات ولكن عملت بشكل جيد حتى الآن ...

لماذا لا تقوم بإنشاء خاصية في صفحة لكل معلمة سلسلة استعلام مواقع المعلومات الممكنة؟

وبهذه الطريقة يمكنك التعامل معها بالطريقة التي تختارها مع بضعة أسطر من التعليمات البرمجية ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top