سؤال

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

انا اتعامل مع إنشاء العمل الآن, لذلك أنا لا ب = new B();ب.A = new A();

الآن أود تقديم نموذج ب ، ومن ثم الاتصال مع إطلالة جزئية على مرور ب.أ.

ولكن ما أعود إما FormCollection ، أو الجديد الكائن مع ب تعيين الحقل إلى قيمة خالية.في الحالة الأولى كل شيء على ما يرام, ولكن ماذا أفعل إذا كان النموذج فشل falidate?هل أنا بحاجة إلى إنشاء الكائنات يدويا مع بيانات خاطئة وتمريرها مرة أخرى مع غير صالحة ModelState?هو الخيار الثاني ممكن على الإطلاق ؟

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

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

المحلول

ويجب أن تكون قادرا على استخدام A و B كما كنت قد وصفها.

ونفترض أن لدينا ما يلي:

public class B {
    public A A {get; set;}
    public string X {get; set;}
    public int Y {get;set;}
}

public class A {
    public string Z {get; set;}
} 

//then in your controller:

public ActionResult Edit () {
    return View ( 
        new B {
            A = new A { Z = "AyyZee" } ,
            X = "BeeEcks",
            Y = 7
        } );
}

وهكذا النموذج الخاص بك هو مثيل B.

وجهة نظركم ونظرة جزئية متداخلة الخاصة بك ينبغي أن تنتج HTML شيء من هذا القبيل:

 <input type="text" name="A.Z" value="AyyZee" />
 <input type="text" name="X" value="BeeEcks" />
 <input type="text" name="Y" value="7" />

والآن يجب أن يكون نموذج الموثق الافتراضي قادرة على ربط هذا الأمر:

[AcceptVerbs( HttpVerbs.Post )]
public ActionResult Edit (B input) {
    // apply changes
    //the binder should have populated input.A
}

لاحظ أن هذا يعمل فقط اذا كانت لديك كل من A و B منشئ افتراضي وهي دروس بسيطة نسبيا. إذا كان لديك شيء أكثر تعقيدا يمكنك استخدام الموثق الخاص بك:

[AcceptVerbs( HttpVerbs.Post )]
public ActionResult Edit ( [ModelBinder( typeof( BBinder ) )] B input) {
    //...
}

public class BBinder : IModelBinder
{
    public object BindModel( ControllerContext controllerContext, ModelBindingContext bindingContext )
    {
        return  
            new B {
                A = new A { Z = Request["A.Z"] } ,
                X = Request["X"],
                Y = int.Parse(Request["Y"])
            };
    }
}

نصائح أخرى

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

public class CustomViewModel
{
    public ModelA myAModel {get;set;}
    public ModelB mybModel {get;set;}
}

وجهة نظر لهذا النموذج سوف إنشاء نموذج يتضمن ألف وباء وسوف تمكنك من ثم ويمكن بعد ذلك formcollection الخاصة بك نشرت استخدامها لتعيين القيم لكل نموذج indivdual وتحديث / إنشاء ثم منفصلة.

مشاكلي مع هذا الرمز سببها شيئين ، سواء في فئة نموذج:

  1. الحقول يجب أن تكون خصائص و ليس العادي
  2. منشئ كان في عداد المفقودين من شأنها تهيئة الداخلية الكائنات

وبالتالي فإن فصول من الحل أعلاه يجب أن تكون:

public class B {
  public A a {get; set;}
  public string x {get; set;}
  public int y {get;set;}
  public B() {
    a = new A();
  }
}

public class A {    
  public string z {get; set;}
  public A() {}
 } 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top