سؤال

لدي نموذج يبدو مثل هذا:

public class SampleModel
{
    public static SampleModel Create()
    {
        return new SampleModel
        {
            Boolean = true,
            // set several more properties...
            Colors = new SelectList(new[] { "Red", "Green", "Blue" }, "Green")
        };
    }

    public bool Boolean { get; set; }
    // define several more properties...
    public SelectList Colors { get; set; }
}

أنا أسمح لـ ASP.NET MVC بدعم الخصائص تلقائيًا باستخدام Html.DisplayForModel() لعرض التفاصيل الخاصة بي و Html.EditorForModel() لعرض التحرير الخاص بي.

نتائج:

  • طريقة العرض "تحرير" تعمل بشكل رائع. Colors تظهر كقائمة تحتوي على ثلاثة عناصر (الأحمر والأخضر والأزرق)، ويتم تحديد اللون الأخضر افتراضيًا.

  • ومع ذلك، بالنسبة لعرض التفاصيل، أحصل على "False True False"، وهي على ما يبدو قائمة بـ IsSelected القيمة لكل عنصر في القائمة.هذا بالتأكيد لا أريده.أود أن يعرض فقط "الأخضر".

  • وهناك مشكلة أخرى هي أنه إذا حاولت أن تفعل UpdateModel(sampleModel) في وحدة التحكم الخاصة بي ، أحصل على الخطأ ، "لا يوجد مُنشئ بدون معلمة محددة لهذا الكائن." هذا هو بسبب Colors هو SelectList, ، ولا يوجد مُنشئ بدون معلمات لـ SelectList, ، لذا لا يمكنه إكمال الربط.

لذا، أعتقد أنني أفهم ما هي المشاكل، لكن يمكنني حقًا استخدام حل جيد لهذا السيناريو، والذي يبدو أنه يظهر كثيرًا عندما يكون لديك كائنات نماذج بها مفاتيح خارجية.

بعض الأسئلة:

  1. كيف يمكنني الحصول على Colors لتظهر كقائمة لعرض التحرير ولكن كقيمة سلسلة بسيطة فقط (على سبيل المثال، "أخضر") في عرض التفاصيل؟
  2. كيف يمكنني منع حدوث خطأ "لا يوجد مُنشئ بدون معلمات" عند تحديث نموذج يحتوي على ملف SelectList?
  3. إذا كان النموذج/ViewModel الخاص بي يحتوي بالفعل على مفتاح خارجي، ColorId, ، بدلاً من Colors, ، ما هي أفضل الممارسات للحصول على طريقة عرض التفاصيل لإظهار اسم اللون الحالي وعرض التحرير لإظهار قائمة تحتوي على جميع أسماء الألوان المدرجة في Color جدول قاعدة البيانات الخاصة بي.إذا كان ذلك مفيدًا، فأنا أستخدم LinqToSql (SqlMetal) لإنشاء فئات النماذج الخاصة بي.
هل كانت مفيدة؟

المحلول

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

  1. إنشاء 3 فئات نموذجية منفصلة:نموذج "مجال" واحد يتكون من كائنات LinqToSql (أو الأغلفة المحيطة بها) ونموذجي عرض، أحدهما لعرض التفاصيل والآخر لعرض التحرير.

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

  3. يجب أن يحتوي نموذج عرض التحرير على خاصية لمعرف اللون المحدد.ويجب أن تحتوي أيضًا على قائمة مختارة من خيارات الألوان المتاحة، مع تعيين القيمة المحددة على المعرف المحدد حاليًا.

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

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

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