سؤال

أنا استخدم DataAnnotations سمات للتحقق من صحة كائنات النموذج الخاصة بي. يبدو فصل النموذج الخاص بي مشابهًا لهذا:

public class MyModel
{
    [Required]
    public string Title { get; set; }

    [Required(ErrorMessage = "At least one editor is required.")]
    public List<User> Editors { get; set; }
}

public class User
{
    public int Id { get; set; }

    [Required]
    public string FullName { get; set; }

    [Required]
    [DataType(DataType.Email)]
    public string Email { get; set; }
}

يشبه إجراء وحدة التحكم الخاصة بي:

public ActionResult NewItem(MyModel data)
{
    if (!this.Model.IsValid)
    {
        // invalid processing
    }
    // valid processing
}

يتم تقديم المستخدم مع عرض يحتوي على نموذج مع:

  • مربع نص يحمل اسم وهمية حيث يقوم المستخدمون بإدخال أسماء المستخدم. لكل مستخدم يدخلون ، يوجد نص عميل مقترن بـ Ajax يقوم بإنشاء ملف <input type="hidden" name="Editors[0].Id" value="userId" /> بالنسبة لكل مستخدم تم إدخاله (وبالتالي فإن فهرس التعداد ليس دائمًا 0 كما هو مكتوب هنا) ، لذلك يمكن أن يستهلك النموذج الافتراضي للاستهلاك وربطه دون أي مشاكل.
  • مربع نص حيث يدخل المستخدمون العنوان

منذ أن أستخدم ASP.NET MVC 2 RTM وهو ما يقوم بالتحقق من صحة النموذج بدلاً من التحقق من صحة الإدخال ، ولا أعرف كيفية تجنب أخطاء التحقق من الصحة. وبما أن المستخدمين يقدمون User.Id, ، بالكامل User يتم التحقق من صحة مثيل الكائن. وهذا لا يزعجني ، طالما كنت أعرف كيفية استبعاد التحقق من صحة الممتلكات الأخرى.

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

المشكلة

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

إذا كان هناك مجرد مرجع مستخدم واحد على MyModel أود أن أكتب

[Bind(Include = "Title, Editor.Id")]

لكن لدي تعداد لهم. كيف أقدم Bind قائمة بيضاء للعمل مع النموذج الخاص بي؟

حل واحد ممكن

يمكنني إنشاء نموذج عرض منفصل لـ User فقط من أجل إدخال كائنات mymodel. أود أن أضع سمات التحقق الفعلية وحذف الخصائص التي لا أحتاج إليها.

public class MyModelUser
{
    [Required]
    public int Id { get; set; }
}
هل كانت مفيدة؟

المحلول

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

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