【问题标题】:Problem with asp.net mvc modelBinding behaviorasp.net mvc modelBinding 行为问题
【发布时间】:2011-03-05 05:14:36
【问题描述】:

我的表格很复杂

它允许用户创建一个有许多活动的收入声明。

当活动的标记如下时,这很好用:

 <tr>
            <td>SomeActivity
                <input type="hidden" value="13123" name="EconomicActivityIncomeDeclarations[0].EconomicActivityId" id="EconomicActivityIncomeDeclarations_0__EconomicActivityId">
            </td>
             <td>
                <input type="text" name="EconomicActivityIncomeDeclarations[0].GrossIncome" id="EconomicActivityIncomeDeclarations_0__GrossIncome" />
            </td>
   </tr>

<tr>
            <td>SomeActivity
                <input type="hidden" value="654654" name="EconomicActivityIncomeDeclarations[1].EconomicActivityId" id="EconomicActivityIncomeDeclarations_1__EconomicActivityId">
            </td>
             <td>
                <input type="text" name="EconomicActivityIncomeDeclarations[1].GrossIncome" id="EconomicActivityIncomeDeclarations_1__GrossIncome" />
            </td>
   </tr>

问题是我正在通过 javascript 动态添加更多活动。它正在呈现像这样的新创建的表单元素

<tr>
            <td>SomeActivity
                <input type="hidden" value="987987" name="EconomicActivityIncomeDeclarations[1b117bc9-ce4b-46d5-9de0-77ba98b82fd0].EconomicActivityId" id="EconomicActivityIncomeDeclarations_1b117bc9-ce4b-46d5-9de0-77ba98b82fd0__EconomicActivityId">
            </td>
             <td>
                <input type="text" name="EconomicActivityIncomeDeclarations[1b117bc9-ce4b-46d5-9de0-77ba98b82fd0].GrossIncome" id="EconomicActivityIncomeDeclarations_1b117bc9-ce4b-46d5-9de0-77ba98b82fd0__GrossIncome" />
            </td>
   </tr>

我得到的奇怪行为是,当前两个(或更多)具有常规格式 [0]、1... 等等,然后我(通过 ajax)实际上添加了更多表单元素 Post Action只将 ajax 元素绑定到 Model...

所以基本上一个包含所有 3 个活动的收入声明,我在这里用作示例,只会将第三个(带有随机字符)添加到收入声明中......

我知道这有点复杂,但如果有人知道为什么会发生这种行为,我将不胜感激......

顺便说一句,这是我使用的。 http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

【问题讨论】:

    标签: asp.net-mvc models modelbinders


    【解决方案1】:

    你可能想看看这篇文章:http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx 最后,Haacked 谈到了他为在项目不是序列时绑定项目所做的一个助手。

    也就是说,当我有一个复杂的列表时,我通常会采取另一条路线。它只适用于启用 javascript。在提交时,我构建了一个代表列表的 json 对象。然后我使用 json2 库对 json 进行字符串化并将其放置在一个隐藏字段中,该字段已发布。在服务器端,使用 JavaScriptSerializer 及其 Deserialize 方法可以轻松构建列表。

    不过,这需要做更多的工作。我猜它最终会产生大约 8 行 javascript 和 2 行服务器端代码。

    【讨论】:

      【解决方案2】:

      您可以尝试使用本文中描述的字典模型绑定器 - Dictionary Model Binder in ASP.NET MVC2 and MVC3

      您应该在代码中修复的唯一问题是不同类型的关键元素。所有键都应具有相同的类型。

      请阅读我对有关 DefaultDictionaryBinder 类源中拟议更改的文章的评论。

      【讨论】:

        【解决方案3】:

        您需要保持顺序正确。添加新活动后,使用 jquery 以正确的顺序重命名文本框。

        这是我使用的代码。

        var tbody = $('#tableId');
            var trs = tbody.children();
            var row = 0;
            for (row = 0; row < trs.length; row++) {
                var txts = trs[row].getElementsByTagName('input');
                for (i = 0; i < txts.length; i++) {
                    var name = txts[i].getAttribute('name');
        
                    txts[i].setAttribute('name', name.replace(/\[.*\]/, 'People[' + row
        + ']'));
                }
            }
        

        【讨论】:

        • 这似乎很复杂.. 我无法理解没有干净的方法来完成这件事:s
        • 我认为它可以使用 JavaScript 轻松完成。我已经用我的代码更新了我的答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-17
        • 1970-01-01
        • 2014-01-24
        • 1970-01-01
        • 2011-11-17
        相关资源
        最近更新 更多