كيف تتعاملون مع إخراج شكلا ديناميكيا في ASP.NET MVC؟

StackOverflow https://stackoverflow.com/questions/223149

  •  03-07-2019
  •  | 
  •  

سؤال

ويقول لإنشاء نموذج باستخدام ASP.NET MVC التي لديها عدد الديناميكي للعناصر النموذج.

وعلى سبيل المثال، كنت في حاجة الى مربع لكل منتج، وعدد من المنتجات يتغير يوما بعد يوم.

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

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

المحلول

ومجرد اعطاء كل مربع قيمة اسم فريدة من نوعها:

<input class="approveCheck" id="<%= "approveCheck" + recordId %>" 
 name="<%= "approveCheck" + recordId %>" type="checkbox" />

وبعد تحليل قائمة القيم النموذج في العمل، بعد تقديم ما يلي:

foreach (var key in Request.Form.Keys)
    {
        string keyString = key.ToString();
        if (keyString.StartsWith("approveCheck", StringComparison.OrdinalIgnoreCase))
        {
            string recNum = keyString.Substring(12, keyString.Length - 12);

            string approvedKey = Request.Form["approveCheck" + recNum];
            bool approved = !String.IsNullOrEmpty(approvedKey);
            // ...

وأنت لا تحتاج إلى تمرير القيم شكل كوسائط. يمكنك فقط الحصول عليها من Request.Form.

واحد خيار آخر: إرسال الموثق نموذج لتغيير قائمة إلى نوع مخصص لتقديم النموذج

نصائح أخرى

ولكل إجابة كريج .. التي هي أكثر أمنا. هناك المراوغات لنشر عناصر النموذج متعددة بنفس الاسم. وأود أن أضيف أنه سيكون من الحكمة أن التفاف المنطق الذي يجعل من "مجموعة" من التحكم في طريقة مشابهة للدت WebForms. نماذج ويب إلحاقها اسم مراقبة الحاويات ويضيف فهرس. على سبيل المثال، في مكرر من عناصر النموذج داخل سيعين (شيء من هذا القبيل) RepeaterName_Element1، RepeaterName_Element2. عندما تذهب للحصول على العناصر بها، لديك لاستخدام FindControl أو شيء من هذا القبيل.

واعتمادا على المواد اللاصقة التي تستخدمها، وهذا ينبغي العمل:

<%var i = 0;
  foreach (var product (IList<ProductSelection>)ViewData["products"]) {%>
      <%=Html.Hidden(string.Format("products[{0}].Id", i), product.Id)%>
      <%=Html.Checkbox(string.Format("products[{0}].Selected", i))%>
      <%=product.Name%><br/>
<%}%>

... الأمر الذي سيؤدي في شيء HTML مثل هذا (لاحظ تدوين مجموعة على أسماء):

<input name="products[0].Id" type="hidden" value="123">
<input name="products[0].Selected" type="checkbox">
Widget
<input name="products[1].Id" type="hidden" value="987">
<input name="products[1].Selected" type="checkbox">
Gadget

... وطريقة تحكم الذي يعالج موضوع:

public ActionResult SelectProducts(IList<ProductSelection> products)
{
     ...
}

وعند ملزمة، سيحتوي المنتجات المعلمة مثيلين من ProductSelection.

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

واعتمادا على البيانات الخاصة بك، هل يمكن إما إخراج "CheckboxList" (وهو أمر غير ممكن في إصدارات أحدث أي أكثر)، واستخدام المعلمة string[]، أو يمكن أن تقوم بإعداد أشكال متعددة وعادل تعديل العمل.

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