كيف يمكنني إيقاف ASP.Net MVC Html.ActionLink من استخدام القائمة الطريق القيم ؟

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

  •  08-07-2019
  •  | 
  •  

سؤال

موقع أنا أعمل على بعض معقدة إلى حد ما توجيه الهياكل نحن نواجه بعض الصعوبات في العمل مع محرك التوجيه لبناء عناوين طريقة تحتاج منها أن يكون بنيت.

لدينا صفحة نتائج البحث التي تستخدم التعابير المنطقية القائمة على نمط مطابقة مجموعة متغيرات عدة في واحد طريق الشريحة (أي"www.host.com/{structuralParameters}" يمكن أن تكون على النحو التالي:"www.host.com/variableA-variableB-variableC" - حيث المتغيرات A إلى C كلها اختياري).هذا هو العمل بالنسبة لنا بخير بعد قليل من العمل.

المشكلة أننا نشهد حل حول مزعج ميزة ActionLink الطريقة:إذا كنت تشير إلى نفس تحكم/العمل فإنه سيتم الاحتفاظ الطريق الحالية قيم ما إذا كنت تريد لهم أم لا.نحن نفضل أن يكون السيطرة على ما لدينا وصلات تبدو في بعض الحالات, لا يمكن أن يكون الموجودة المعلمات الاحتفاظ بها.على سبيل المثال سيكون من أين موقعنا الرئيسي الملاحة يؤدي إلى صفحة نتائج البحث مع عدم وجود معايير تعيين الافتراضي صفحة البحث ، إذا أردت.أنا أقول هذا هو ميزة مزعج لأنه هو حالة نادرة من ASP.Net إطار MVC يملي على ما يبدو دون تنفيذ واضحة امتداد نقطة نفضل عدم إنشاء مخصص ActionLink كود لكتابة الملاحة بسيطة الرابط في الصفحة الرئيسية!

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

أنا على علم بأن لدينا التوجيه هيكل يقض مضجع هذه المشكلة - نحن ربما لن يكون لديك أي مشكلة إذا استخدمنا نهج أبسط (أيwww.host.com/variableA/variableB/variableC) ولكن لدينا بنية عنوان URL غير قابل للتفاوض - تم تصميمه لتلبية احتياجات محددة للغاية تتعلق الاستخدام, سيو, وصلة/تبادل المحتوى.

كيف يمكننا استخدام Html.ActionLink لتوليد روابط الصفحات دون الوقوع مرة أخرى على المسار الحالي البيانات (أو ، إذا كان ذلك ممكنا ، تحتاج إلى صراحة باستثناء الطريق شرائح) حتى لو كانت تلك الروابط تؤدي إلى نفس الإجراء الأساليب ؟

إذا نحن بحاجة إلى صراحة استبعاد الطريق قطاعات كيف يمكننا منع الأسلوب من تقديم طرق مثل سلسلة استعلام المعلمات ؟

هذا على ما يبدو مشكلة صغيرة هي التي تسبب لنا الدهشة من كمية الحزن و سأكون ممتنة للحصول على أي مساعدة في حل ذلك.

تحرير:كما طلب LukLed ، وهنا عينة ActionLink الاتصال:

// I've made it generic, but this should call the Search action of the 
// ItemController, the text and title attribute should say "Link Text" but there
// should be no parameters - or maybe just the defaults, depending on the route.
// 
// Assume that this can be called from *any* page but should not be influenced by
// the current route - some routes will be called from other sections with the same
// structure/parameters.
Html.ActionLink( 
    "Link Text",
    "Search", 
    "Item", 
    new { }, 
    new { title = "Link Text" } 
);
هل كانت مفيدة؟

المحلول

وتحديد القيم الطريق إلى أن تكون سلسلة فارغة أو فارغة عند الاتصال Html.ActionLink أو Html.RouteLink (أو أي طريقة الجيل URL) سوف مسح خارج "المحيط" القيم الطريق.

وعلى سبيل المثال، مع الطريق تحكم MVC / العمل / معرف القياسي لنفترض أنك على "الصفحة الرئيسية / مؤشر / 123". إذا كنت استدعاء Html.RouteLink(new { id = 456 }) ثم سوف تلاحظ MVC القيم طريق "المحيط" من controller="Home" وaction="Index". وسوف تلاحظ أيضا قيمة الطريق المحيطة من id="123" ولكن هذا سوف تحصل على تجاوزها من قبل صريح "456". سيؤدي هذا إلى URL ولدت لتكون "الوطن / مؤشر / 456".

ووترتيب المعلمات الأمور كذلك. على سبيل المثال، نقول لكم دعا Html.RouteLink(new { action = "About" }). ان "حول" العمل الكتابة "مؤشر" العمل الحالي، وان "المعرف" المعلمة الحصول على تطهيرها من أصل تماما! ولكن لماذا تسأل؟ لأنه بمجرد أن يبطل شريحة المعلمة ثم كافة شرائح المعلمة بعد ذلك سوف تحصل على إبطال. في هذه الحالة، "العمل" ويبطل قيمة صريحة جديدة وبالتالي فإن "الهوية"، والتي تأتي بعد ذلك، وليس لديها قيمة صريحة، كما يحصل تبطل. وهكذا، فإن URL ولدت يكون مجرد "الرئيسية / حول" (بدون ID).

في هذا السيناريو نفسه إذا دعت Html.RouteLink(new { action = "" }) ثم URL ولدت من شأنه أن يكون مجرد "الوطن" لأنك تبطل "العمل" مع سلسلة فارغة، ثم الذي تسبب في "الهوية" ليبطل كذلك لأنه جاء بعد "العمل" تبطل.

نصائح أخرى

الحل في جذور المشكلة

يبدو أن الحل الأمثل (هذا لا رائحة مثل الحل) هو الذي يحل المشكلة حيث أنه له جذور في التوجيه.

لقد كتبت مخصص Route فئة تسمى RouteWithExclusions التي هي قادرة على تحديد مسار قيمة الأسماء التي ينبغي استبعادها/إزالتها عند إنشاء عناوين url.المشكلة هي عند توجيه يسقط من خلال طرق الجدول اللاحق طرق لا تملك نفس الطريق القيمة الأسماء...

المشكلة كلها هي مفصلة وأوضح في بلدي بلوق وظيفة و كل رمز يتم توفيرها من هناك أيضا.التحقق من ذلك, قد تساعدك على حل هذا التوجيه المشكلة.لقد كتب أيضا اثنين إضافية MapRoute أساليب الإرشاد التي تأخذ معلمة إضافية.

إذا كنت تريد السيطرة الكاملة على الارتباط، فقط بناء على الرابط نفسك:

<a href="~/variableA/variableB/<%= Html.Encode(Model.Target) %>">Click Here</a>

والبديل كل ما تحتاجه داخل السمة href.

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