سؤال

في واجهتي لدي قائمة من مربعات النص ، شيء من هذا القبيل:http://screencast.com/t/yjixnjuynmu

عدد مربعات النص غير معروف لأن كل منهم يرتبط بقالب. في صفحتي ، الهدف هو ربط رقم ببعض هذه القوالب.

فيما يلي عينة من رمز HTML:

<%  // loop on the templates
    foreach(ITemplate template in templates)
    {
        // get the content from the input dictionary
        int val;
        content.TryGetValue(template.Id, out val);
        // convert it as a string
        string value = ((val > 0) ? val.ToString() : string.Empty);

        // compute the element name/id (for dictionary binding)
        string id = ??????????
        string name = ??????????????
%>
        <label for="<%= name %>"><%= template.Name %></label>
        <input type="text" id="<%= id %>" name="<%= name %>" value="<%= value %>" />
        <br />
<%  }
%>

ما أتوقعه ، في وحدة التحكم الخاصة بي ، هو الحصول على معرف حيث يكون INT الأول هو معرف القالب ، والآخر هو العدد الذي قدمه المستخدم.

هذا ما أريد:

public ActionResult Save(int? id, Dictionary<int, int> countByTemplate)

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

أسئلة :

  • هل هناك مجموعة جيدة من كيفية عمل النموذج؟ أود بعض الشيء شاملة ، لقد سئمت من مدونة 84093043 التي تتحدث عن مثال محدد معين.
  • كيف يمكنني بناء HTML الخاص بي ، باستخدام معرف (أو حتى معرف في عمل وحدة التحكم الخاصة بي؟

شكرا جزيلا لمساعدتكم

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

المحلول 2

حسنًا ... بفضل ليفي ، تمكنت من الحصول على حل. ليس المنظف ، لكنه يعمل.

يجب كتابة HTML بهذه الطريقة:

<%
int counter = 0;
// loop on the templates
foreach(ITemplate template in templates)
{
        // get the value as text
        int val;
        content.TryGetValue(template.Id, out val);
        var value = ((val > 0) ? val.ToString() : string.Empty);

        // compute the element name (for dictionary binding)
        string id = "cbts_{0}".FormatMe(template.Id);
        string dictKey = "cbts[{0}].Key".FormatMe(counter);
        string dictValue = "cbts[{0}].Value".FormatMe(counter++);
%>
        <input type="hidden" name="<%= dictKey %>" value="<%= template.Id %>" />
        <input type="text" id="<%= id %>" name="<%= dictValue %>" value="<%= value %>" />
        <label for="<%= id %>"><%= template.Name %></label>
        <br />
<%  }
%>

اضطررت إلى إضافة حقل مخفي لتخزين القيمة. لقد قدمت عدادًا "مزيفًا" لمجرد حلق القاموس على الطريق الذي يريده ASP.NET MVC. نتيجة لذلك ، حصلت على قاموس مليء بقيمي و "0" عندما يكون مربع النص فارغًا.

ظهرت مشكلة أخرى: ModelState كان يعتبر غير صالح لأن "القيمة مطلوبة". لا أريد أن تكون قيمي مطلوبة ، لكن بالنظر إلى رمز النموذج ، لم أجد طريقة لإخبار الموثق بأن القيمة غير مطلوبة.

لذلك قمت بخداع ModelState في وحدة التحكم الخاصة بي ، إزالة كل الأخطاء ، مثل هذا:

public ActionResult Save(int? id, Dictionary<int, int> cbts)
{
    // clear all errors from the modelstate
    foreach(var value in this.ModelState.Values)
        value.Errors.Clear();

حسنًا ... لقد حصلت على حل فعلي ، لكن HTML هو نوع من القبيح الآن ، ومكافحة (باستخدام فهرس للحلق على مجموعة غير مفهومة ؟؟). وأنا بحاجة إلى الخداع في كل مرة سأستخدم فيها هذا النوع من الربط لجعل كل شيء يعمل بشكل صحيح.

لذلك سأفتح الآن منشورًا جديدًا لجعل موثق القاموس أفضل. ها هو: ASP.NET MVC 2 - BESTORMBINDING للقاموسu003Cint, int>

تعديل - هناك حل أنظف ، بفضل بافل تشوتشوفا.

في رمز وحدة التحكم ، استخدم int لا البولومير كقيمة للقاموس. رمز أكثر قليلاً لإضافته ، ولكن أكثر نظافة.

public ActionResult Save(int? id, Dictionary<int, int?> cbts)
{
    // this is our final dictionary<int, int>
    Dictionary<int, int> cbtsFinal = new Dictionary<int, int>();
    // loop on the dicitonary with nullable values
    foreach(var key in cbts.Keys)
    {
        // if we have a value
        if(cbts[key].HasValue)
            // then put it in the final dictionary
            cbtsFinal.Add(key, cbts[key].Value);
    }

نصائح أخرى

يمكن العثور على معلومات حول كيفية كتابة عناصر الإدخال الخاصة بك لربط المصفوفات والقواميس والمجموعات الأخرى في http://www.hanselman.com/blog/aspnetwireformatformodelbindingToArraysListsCollectionsDictionaries.aspx.

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