سؤال

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

إنني أستخدم JQuery بنجاح لإنشاء عناصر النماذج الإضافية ، فهرسة بشكل صحيح ، وما إلى ذلك. مشكلتي هي أفضل طريقة لقراءة هذه داخل وحدة التحكم الخاصة بي. تتوقع وحدة التحكم في المقالة فقط كائنًا واحدًا ، IList<Product> في حين أن وحدة التحكم الخاصة بي تتوقع بالفعل ملف FormCollection form والآن أحاول أيضًا إرسالها IList<Itmes> كذلك.

هل يجب أن أضيف هذا إلى المعلمات المتوقعة بواسطة وحدة التحكم أو الوصول عبر النموذج ["العناصر"] أو أي شيء آخر؟

رأي

<form action="/MyItems/Add" method="post">
   <input type="text" name="Title" value="" />

   <input type="hidden" name="myItem.Index" value="0" />
   <input id="item[0].Amount" name="item[0].Amount" type="text" value="" />
   <input id="item[0].Name" name="item[0].Name" type="text" value="" />

   <input type="hidden" name="myItem.Index" value="1" />
   <input id="item[1].Amount" name="item[1].Amount" type="text" value="" />
   <input id="item[1].Name" name="item[1].Name" type="text" value="" />
</form>

مراقب

public ActionResult Add(FormCollection form)
{
    string Title = form["Title"];
    List<Item> Items = form["items"].ToList();
}

DTO

public class Item()
{
    int Amount {get; set; };
    string Name {get; set; };
}
هل كانت مفيدة؟

المحلول 2

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

List<Item> itemList = new List<Item>();
int i = 0;

while ( form["item[" + i + "].Amount"] != null)
{
    itemList.Add(new Item()
        {
            Amount = Convert.ToInt32(form[String.Format("item[{0}].Amount",i )]),
            Name = form[String.Format("item[{0}].Name",i )]
        });
}

نصائح أخرى

يمكنك فقط إضافة myitem كمعلمة مثل ذلك:

public ActionResult Add(FormCollection form, List<Item> myItem)
{
}

بعد ذلك سوف يرتبط تلقائيًا من بيانات النموذج وملء معلمة MyItem.

لم أجرب هذا ، لذا عليك أن تمنحها ، ولكن لماذا لا تستخدم طريقة updateModel أو TryupDatemodel؟ يجب أن يرتبط هذا بنفس طريقة تمرير Ilist في عمل وحدة التحكم.

هذا هو:

public ActionResult Add(FormCollection form)
{
    List<Item> items = new List<Item>();
    TryUpdateModel(items, form);
}

أنا لست على جهاز الكمبيوتر الخاص بي ، لذلك لست متأكدًا من أنه سيعمل ، لكنني أتوقع ذلك. اسمحوا لي أن أعرف إذا كان هذا ما تحتاجه.

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

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