如何在ASP.net MVC中使用jQuery替换复杂类型子集合的所有id属性
我的情况如下: 我正在编写一个ASP.net MVC 1网站,我有一个创建/编辑表单,它使用默认模型绑定将表单解析为强类型复杂对象 我发布的对象有另一个复杂类型的子集合,我为模型绑定器设置id格式的方式如下:如何在ASP.net MVC中使用jQuery替换复杂类型子集合的所有id属性,jquery,asp.net-mvc,Jquery,Asp.net Mvc,我的情况如下: 我正在编写一个ASP.net MVC 1网站,我有一个创建/编辑表单,它使用默认模型绑定将表单解析为强类型复杂对象 我发布的对象有另一个复杂类型的子集合,我为模型绑定器设置id格式的方式如下: <div class="childContainer" > <!-- There's one of these for each property for each child collection item --> <%= Html.TextBo
<div class="childContainer" >
<!-- There's one of these for each property for each child collection item -->
<%= Html.TextBox("ChildCollectionName[0].ChildPropertyName", /* blah blah */ ) %>
<%= Html.TextBox("ChildCollectionName[0].OtherChildPropertyName", /* blah blah */ ) %>
<!-- ... -->
</div>
这将被渲染为
<div class="childContainer" >
<input id="ChildCollectionName[0]_ChildPropertyName" ... />
<input id="ChildCollectionName[0]_OtherChildPropertyName" ... />
...
</div>
<div class="childContainer" >
<input id="ChildCollectionName[1]_ChildPropertyName" ... />
<input id="ChildCollectionName[1]_OtherChildPropertyName" ... />
...
</div>
...
...
对于chlid集合中的每个条目
此集合是使用jQuery在表单中动态创建的,因此可以添加、删除条目等。每当集合上有操作时,我都需要更新索引,以便在服务器端正确绑定它
当我更新子系统中的索引时,替换所有html输入id的最佳方法是什么,例如
替换所有[*]-->[N],其中N是正确的索引
使用jQuery/JavaScript
我现在有一些代码,但它有问题,我认为有一个更简单的解决方案
此外,如果你有一个更简单的方法来确定儿童收藏,我也会接受任何建议
塔克斯 不必在每次集合更改时操作DOM元素,您可以在JavaScript变量中保留一个元素数组,并在需要添加/删除元素时直接使用该数组。然后使用数组重新渲染输入元素。我在视图中使用模型对象的动态列表时做了类似的事情。我在表单中使用了表结构,但我相信您可以应用类似的逻辑 我使用了添加/删除表行的按钮。提交表单时,您必须保持数字顺序,因此id应为0,1,2,3,不能为0,2,3,4等。我的设计更简单,您只能在列表底部添加一项,而只能删除列表中的最后一项。因此,我可以保持身份证的秩序 在操作动态表单时,您可能会发现一些代码很有用
$('.add').live('click', function()
{
var addRowId = $('#myTable tr').length;
var internalId = addRowId - 1; //subtract -1 for header row
//clone the last row
var row = $('#ft tr:last').clone(false);
//modify the input id and name values
row.find(':input')
.attr('id', function() { return
$(this).attr('id').replace(/\[[\d+]\]/g, '[' + internalId + ']');
})
.attr('name', function() { return
$(this).attr('name').replace(/\[[\d+]\]/g, '[' + internalId + ']');
});
//add the new row
$('#ft tr:last').after(row);
return false;
});
注意:我在升级到MVC 2时发现一个变化,id的生成发生了变化
通常css类名没有前导点。我甚至不确定这是合法有效的语法。而且,你还没有足够清楚地解释你想做什么。你说的是id(“我格式化id的方式如下…”)。但我没有看到任何身份证。您是指HTML文档中元素上的ID吗?我没有看到。也许你可以用更简单、更清楚的术语重申这个问题。你应该提供调用HTML.TextBox生成的完整HTML输出,假设它包含你想要捕获的DOM ID(同时假设此代码是迭代的)。@Chesso css名称在我的例子中是一个输入错误(不是复制粘贴的)我添加了一个简化版的html输出,我无法发布实际代码(专有),但这应该可以更好地了解我正在尝试做什么…感谢您提供有关v2更改的提示,您的解决方案包括一些我不知道的选择器,它们将非常有用。我实际上也在使用一个表结构,但为了简单起见,在问题中省略了它。另一个区别是,我允许删除任何项目,但这仍然是非常适用和有益的。在遍历表时,有没有跳过表头行的好方法?现在我只是在使用if($(this.find(“th”).length==0)之类的东西。。。这是一个“tr”,不知道是否有更好的方法。。。谢谢您可以通过使用和来区分这一点,并在javascript中使用$(“#mytable tbody tr”)。长度应该有效。