MvcSiteMapProvider MVC5 - إضافة "العنوان" كقيمة مسار لا تعمل (المقصود)

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

  •  21-12-2019
  •  | 
  •  

سؤال

لقد واجهت للتو "مشكلة" في استخدام MvcSiteMapProvider MVC5 الحالي (من nuget، تمت ترقيته من MVC4).اعتدت على إضافة "عنوان" القياس الروتيني إلى القيم الروتينية لـ DynamicNodes عند إنشائها في DynamicNodeProvider.كان هذا يعمل بشكل جيد في الإصدار السابق، ولكن لم أتلقى أي خطأ عند محاولة ذلك:

An exception of type 'MvcSiteMapProvider.Collections.Specialized.ReservedKeyException' occurred in MvcSiteMapProvider.dll but was not handled in user code

Additional information: The node with key 'someKey' may not add a route value with the key 'title' and value 'someValue' to the RouteValues dictionary because the key is a reserved name. Reserved names are keys that are meant for use internally by MvcSiteMapProvider rather than a dictionary value.

لقد تلقيت الرسالة، ليس من المفترض أن أضيف "العنوان" كمعلمة مسار مخصصة.ومع ذلك، يستخدم مشروعي الكامل "{title}" في تعريفات المسار، وسيتعين علي تغيير كل شيء من العنوان إلى "{id}" (أو أي شيء آخر).

والآن سؤالي:هل من الممكن بطريقة أو بأخرى إضافة قيمة توجيه "العنوان" المخصصة إلى العقد الديناميكية على أي حال؟أم أنه ببساطة غير ممكن؟

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

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

المحلول

يمكنك التغلب على هذا القيد عن طريق الميراث ReservedAttributeNameProvider وتجاوز IsRouteAttribute الطريقة على النحو التالي.

public class MyReservedAttributeNameProvider
    : ReservedAttributeNameProvider
{
    public MyReservedAttributeNameProvider(
        IEnumerable<string> attributesToIgnore
        ) : base(attributesToIgnore)
    {
    }

    public override bool IsRouteAttribute(string attributeName)
    {
        return attributeName != "visibility"
            && !attributesToIgnore.Contains(attributeName)
            && !attributeName.StartsWith("data-");
    }
}

يمكنك بعد ذلك إدخال ReservedAttributeNameProvider الجديد الخاص بك باستخدام DI خارجي (عن طريق الترقية إلى إحدى حزم DI).على سبيل المثال، ستحتاج فقط إلى استبدال التسجيل الحالي بالتسجيل الخاص بك.التنفيذ هذه هي الطريقة التي سيبدو بها ذلك في StructureMap، ولكن يمكنك بسهولة استخدام أي حاوية DI أخرى.

this.For<IReservedAttributeNameProvider>().Use<MyReservedAttributeNameProvider>()
    .Ctor<IEnumerable<string>>("attributesToIgnore").Is(new string[0]);

أقترح على المدى الطويل أن تفتح ملف مشكلة جديدة على جيثب.لا أستطيع التفكير في أي سبب لفرض ذلك في جميع المجالات - يجب أن يكون هذا القيد على أسماء السمات موجودًا فقط في حالة تكوين العقد في XML، وفي هذه الحالة يجب ألا تكون هناك رسالة خطأ - فقط تجاهل القيمة بصمت.كما أن حقيقة أن MvcSiteMapNodeAttribute به نفس الخلل هو قرار تصميم سيء تم ترحيله من الإصدار 3.0.يجب أن يكون هناك "قاموس" RouteValues ​​(حسنًا، قاموس JSON على أي حال) لتحديد القيم هناك بدلاً من حشر كل شيء في السمات ومحاولة تخمين القيم التي تذهب إلى أين.ولكن في كلتا الحالتين، ليس من المنطقي استبعاد أي أسماء سمات من MvcSiteMapNodeAttribute أو العقد الديناميكية أو تطبيقات ISiteMapNodeProvider المخصصة نظرًا لأن السمات لم تعد تقوم بتحديث الخصائص أو العكس.

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