كيفية إضافة قائمة ثابتة من العناصر في MVC Html.DropDownList()

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

سؤال

أرغب في تعيين قائمة ثابتة بالعناصر في ملف SelectList() إلى أ Html.DropDownList() في ASP.NET MVC، ما هي أفضل الممارسات؟

كنت على وشك محاولة إيجاد طريقة للاستخدام new SelectList(new {key = "value"}... ولكن أولاً، لم ينجح الأمر، وثانيًا، هل سأخالف القانون هنا، إذا تم الإعلان عن قائمتي الثابتة في ViewData على أي حال ومرت IList/IENumerable?

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

المحلول 3

وOK قررت أن تأخذ بلدي المشورة، وهذا ينبغي أن تكون محددة في وحدة تحكم:

ولمعلوماتك، أنا فقط عاد:

PageData data = new PageData()
           {
               Formats = new[]
                             {
                                 new { ID = "string", Name = "Text" },
                                 new { ID = "int", Name = "Numeric" },
                                 new { ID = "decimal", Name = "Decimal" },
                                 new { ID = "datetime", Name = "Date/Time" },
                                 new { ID = "timespan", Name = "Stopwatch" }
                             },
               .............

           };
return View(data);

... (تجاهل السياق) وفي الجانب مشاهدة ASPX:

<%= Html.DropDownList("type.field", new SelectList(ViewData.Model.Formats, "ID", "Name"...

وإذا كان أي شخص لديه وسيلة أكثر المثلى للقيام بذلك سأكون سعيدا لقبول الإجابة.

نصائح أخرى

وإنه لأفضل الممارسات لا لإنشاء SelectList في طريقة العرض. يجب عليك إنشائه في وحدة تحكم وتمريرها باستخدام ViewData.

مثال:

  var list = new SelectList(new []
                                          {
                                              new {ID="1",Name="name1"},
                                              new{ID="2",Name="name2"},
                                              new{ID="3",Name="name3"},
                                          },
                            "ID","Name",1);
            ViewData["list"]=list;
            return View();

ويمكنك تمرير إلى منشئ: الكائن IEnumerable، الحقل قيمة حقل النص والقيمة المحددة

.

في الملف:

 <%=Html.DropDownList("list",ViewData["list"] as SelectList) %>

يتجنب جميع مبتدئي MVC في البداية الكلمة "M"، ولكنها تبدأ نوعًا ما في بداية اختصار MVC.لذلك ربما، ربما فقط، قد ترغب في بدء الحل باستخدام نموذج...فقط أقول.

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

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

ثم قم ببساطة بالرجوع إلى النموذج الموجود في وحدة التحكم وقم بتحويل القاموس إلى قائمة SelectList في العرض باستخدام DropDownListFor الذي يحتوي على تعبير LINQ Lambda.

تخويف؟انت لست وحدك.لقد كنت بالتأكيد كذلك.إليك مثال استخدمته لتعليم نفسي الحروف M وV وC:

الجزء النموذجي من MVC:

using System.Web.Security;
using System.Collections.Generic;
using System.Text;
using System.Linq.Expressions;
using System.Web.Routing;
using System.Web.Helpers;
using System.Web.Mvc.Html;
using MvcHtmlHelpers;
using System.Linq;

// EzPL8.com is the company I work for, hence the namespace root. 
    // EzPL8 increases the brainwidths of waiters and bartenders by augmenting their "memories" with the identifies of customers by name and their food and drink preferences.
   // This is pedagogical example of generating a select option display for a customer's egg preference.  

namespace EzPL8.Models     
{
    public class MyEggs    
    {
        public Dictionary<int, string> Egg { get; set; }

        public MyEggs()  //constructor
        {
            Egg = new Dictionary<int, string>()
            {
                { 0, "No Preference"},  //show the complete egg menu to customers
                { 1, "I hate eggs"},    //Either offer an alternative to eggs or don't show eggs on a customer's personalized dynamically generated menu

                //confirm with the customer if they want their eggs cooked their usual preferred way, i.e.
                { 2, "Over Easy"},  
                { 3, "Sunny Side Up"},
                { 4, "Scrambled"},
                { 5, "Hard Boiled"},
                { 6, "Eggs Benedict"}
            };
    }
}

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

public ActionResult Index()
{
   var model = new EzPL8.Models.MyEggs();
   return View(model);
}

يستخدم العرض DropDownListFor (بدلاً من DropDownList) ويتطلب تعبير Lambda للكتابة القوية في إعادة هيكلة الحدث:

@Html.DropDownListFor(m => m.Egg, new SelectList( Model.Egg, "Key", "Value"))

Voilà، HTML الناتج:

<select id="Egg" name="Egg">
<option value="0">No Preference</option>
<option value="1">I hate eggs</option>
<option value="2">Over Easy</option>
<option value="3">Sunny Side Up</option>
<option value="4">Scrambled</option>
<option value="5">Hard Boiled</option>
<option value="6">Eggs Benedict</option>
</select>

ملحوظة:لا تخلط بينك وبين القيمة الموجودة <option value="6">, ، وهو المفتاح من القاموس، من "القيمة" في SelectList()، وهو النص/العنوان (على سبيل المثال.Eggs Benedict) الذي ينتهي بين علامات الخيار.

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

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

سؤال بلاغي:هل يجب علي تعديل جميع وحدات التحكم وطرق العرض المتعلقة بتفضيلات بيض العميل؟أو ببساطة أدخل { 7، "حساسية للبيض"} في النموذج؟

سؤال بلاغي آخر:ليست العجة البيض؟هل تريد إضافة {8, "Omelette, Western"}, {9, "Omelette, Mushroom-Feta-Spinach"} مرة واحدة إلى النموذج ونشر الإضافات الجديدة تلقائيًا عبر جميع القوائم المنسدلة في جميع طرق العرض التي تستخدمها ؟

الخلاصة (الخطوط) ربما يكون هذا أكثر بكثير مما طلبته، ...ولكنك قلت MVC، وليس VC فقط:
1.استخدم نموذجًا في *م*VC.2.استخدم قاموسًا في النموذج عندما لا تعتمد قائمة التحديد على أكثر من "مفتاح أساسي" وعنوان.3.إذا كانت قائمتك الثابتة لا تتوافق مع جدول البحث في قاعدة البيانات في مكان ما، فمن المحتمل أن تطبيقك ليس مفيدًا جدًا.عند إضافة خيار إلى قائمة ثابتة، ستحتاج أيضًا على الأرجح إلى إجراء إدراج في جدول البحث لتجنب حدوث خطأ في تكامل علاقة المفتاح الأساسي/المفتاح الخارجي مع الجداول الأخرى في قاعدة البيانات.4.استخدم لامدا وهياكل البيانات المكتوبة بقوة لتجنب الأخطاء والحصول على دعم الكتابة المسبقة.

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