سؤال

لدي الكيانات التالية:

public class Category
{
    public virtual int CategoryID { get; set; }

    [Required(ErrorMessage = "Section is required")]
    public virtual Section Section { get; set; }

    [Required(ErrorMessage = "Category Name is required")]
    public virtual string CategoryName { get; set; }
}

public class Section
{
    public virtual int SectionID { get; set; }
    public virtual string SectionName { get; set; }
}

الآن ضمن عرض فئة الإضافة الخاص بي ، لدي مربع نص لإدخال SectionId على سبيل المثال:

<%= Html.TextBoxFor(m => m.Section.SectionID) %>

أرغب في إنشاء موثق نموذج مخصص للحصول على المنطق التالي:

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

كنت أقدر حقًا المساعدة هنا لأن هذا كان يحيرني لفترة من الوقت. شكرًا

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

المحلول 2

باستخدام الحل الذي نشره ديف ثيبن ، توصلت إلى ما يلي:

public class CustomModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        if (bindingContext.ModelType.Namespace.EndsWith("Models.Entities") && value != null && (Utilities.IsInteger(value.AttemptedValue) || value.AttemptedValue == ""))
        {
            if (value.AttemptedValue != "")
                return Section.GetById(Convert.ToInt32(value.AttemptedValue));
            else
                return null;
        }
        else
            return base.BindModel(controllerContext, bindingContext);
    }
}

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

نصائح أخرى

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

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