كيف يمكنني إرجاع قوائم عامة متعددة في مكالمة ويب واحدة؟

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

  •  20-08-2019
  •  | 
  •  

سؤال

قررت أن إرجاع مجموعات البيانات والعمل مع مجموعات البيانات وجداول البيانات في تطبيق الواجهة الأمامية يعد فكرة سيئة إلى حد ما.لذلك باستخدام سحر الأدوية الجنيسة، أقوم بإرجاع قائمة عامة عبر استدعاء خدمة الويب (وليس WCF فقط عادي ol' asmx).يعمل هذا بشكل رائع طالما أنك بحاجة إلى إرجاع قائمة واحدة لكل مكالمة إلى خدمة الويب الخاصة بك.

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

لذلك، سيكون من الرائع إرجاع قوائم عامة متعددة في مكالمة ويب واحدة.

الأشياء التي حاولت:

  1. استخدام قائمة القوائم
  2. استخدام مجموعة من القوائم العامة
  3. إنشاء فئة أساسية واستخدام مجموعة من List<Base>, ، توجد مشكلات في التحويل عند محاولة إدخال كائنات في ذلك List<Base>.
  4. إنشاء فئة لها خصائص تعود List<MyOneObject>, List<MySecondObject>, ، إلخ.هذا يعمل ولكنه فوضوي نوعًا ما ...لدي الكثير من الفصول والشاشات في التطبيق حيث سيحدث هذا.يمكنني إنشاء فئة مثل هذه لها خصائص List<MyType> لكل فئة، ولكن كما قلت أعتقد أن هذا قد يخرج عن نطاق السيطرة.

لذا، لدي في هذه المرحلة خياران، رقم 4 في القائمة أعلاه، أو قم فقط بإرجاع مجموعة بيانات أفضل عدم القيام بها:0)

وقد واجه أي شخص هذا من قبل؟

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

المحلول

حسنًا، لا أعتقد أن إرجاع قوائم متعددة يعد فكرة جيدة، ولكن إذا كنت ستفعل ذلك، فسوف أقوم بإنشاء فئة مجمعة مع عرض كل قائمة كخاصية في تلك الفئة.

شيء مثل

class Wrapper
{
   public List<object1> Object1List {get;set;}
   public List<object1> Object2List {get;set;}

}

نصائح أخرى

الإجابة هي رقم 4، عبر فصل دراسي، إما ذلك أو عبر مكالمات متعددة، وهو ما تفضل عدم القيام به

حسنًا، يبدو أنني أبدأ كل إجاباتي اليوم بسؤال؟لماذا لا تريد إجراء مكالمات متعددة خلف الكواليس؟

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

ما قيل:إذا كانت القوائم التي تعيدها قريبة من بعضها البعض في الطول، فيمكنك استخدام القاموس، باستخدام المفتاح لتمثيل "اسم الخاصية" والقيمة لتمثيل القيمة بشكل جيد.يتطلب القليل جدًا من التعليمات البرمجية وتحويل أي مصدر على الإطلاق إلى قاموس باستخدام .ToDictionary() يكون أمرًا مستقيمًا إلى حد ما (إذا لم يكن المصدر IEnumerable، فإن تنفيذ .ToDictionary() لهذا المصدر عادةً ما يكون مستقيمًا للأمام)

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

إذا قمت بإرجاع فئة .NET، فستقتصر على لغات .NET فقط التي تتصل بالخدمة، وإذا تغير ذلك، فسيتعين عليك إعادة كتابة فئات الغلاف، وما إلى ذلك.باستخدام XML، يمكنك الاتصال بالخدمة بأي لغة.لذلك، إذا كنت تحاول فصل تطبيق الواجهة الأمامية الخاص بك عن طبقة البيانات/النموذج، فسيكون هذا طريقًا جيدًا يجب اتباعه.

لا يزال بإمكانك إلغاء تسلسل نتيجة XML إلى فئة .NET إذا كنت ترغب في ذلك، أو مجرد استخراج البيانات مباشرة.يعد LINQ to XML سريعًا وسهل الاستخدام وسيسمح لك بتحويل النتيجة إذا لزم الأمر.

<result>
  <dropdownA_item>
     <Value/>
  </dropdownA_item>
  <dropdownA_item>
  <dropdownA_item>
  <dropdownB_item>
  <dropdownB_item>
  <dropdwonC_item>
  // return as many different lists for as many different drop downs
</result>

// manually extract the data or deserialize into .net class
XElement result = GetResult();
dropdownBox[x].Items = result // you could even have an array of dropDownBoxes[x] and bind to all of them in one loop
    .Where(o => o.Name == "dropdown" + x)
    .Select(o => o.Element("Value").Value) );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top