2010-03-19 58 views
0

复杂类型的子集的所有ID属性,这里是我的情况:如何更换在ASP.net使用jQuery MVC

我正在写一个ASP.net MVC 1点的网站,我有一个创建/编辑表单它使用默认模型绑定将表单解析为强类型的复杂对象。

我张贴的对象有另一个复杂类型的子集和格式化我的id为模型绑定的方式如下:

<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?

我现在编写了一些东西,但它的错误,我认为有一个更简单的解决方案。

此外,如果您有更简单的方法来识别子集合,我也会对此采取任何建议。

Thanx!

+1

通常的CSS类名没有一个前导点。我甚至不确定这是合法的,有效的语法。另外,你还没有足够清楚地解释你想做什么。你在谈论ids(“我如何格式化我的id的方式如下..”)。但我没有看到任何ID。你是否指HTML文档中元素的id?我没有看到任何。也许你可以用更简单,更清晰的术语来重述这个问题。 – Cheeso 2010-03-19 21:27:37

+0

您应该提供由Html.TextBox的调用生成的完整的HTML输出,假设它包含您希望捕获的DOM ID(并且假设此代码已迭代)。 – 2010-03-19 21:35:30

+0

@Chesso css的名字是在我的情况(不复制粘贴)的错字 我添加了一个简化版本的html输出,我不能发布实际代码(专有),但这应该更好地了解什么我正在努力...... – TJB 2010-03-19 21:44:01

回答

1

我做过类似的事情,我在View中使用了Model对象的动态列表。我为表单使用了表格结构,但我相信你可以应用类似的逻辑。

我使用了添加/删除表格行的按钮。在提交表单时,你必须保持数字顺序,所以id的值应该是0,1,2,3,不能是0,2,3,4等等。我的设计比较简单,只能在列表的底部添加一个项目并只删除列表中的最后一个项目。因此,我可以维护ID的顺序。

在操作动态表单时,您可能会发现一些有用的代码。

$('.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的改变...

ASP.NET-MVC2 Preview 1: Are There Any Breaking Changes?

+0

感谢您对v2更改的关注,您的解决方案包括一些我没有意识到的选择器,它们将会有所帮助。我实际上也使用了表格结构,但为了简化问题省略了它。另一个区别是我允许删除任何项目,但这仍然非常适用和有用。任何好的技术用于在迭代时跳过表格的标题行?现在我只是使用类似if($(this).find(“th”)。length == 0)...这是一个“tr”,不知道是否有更好的方法.. 。 谢谢! – TJB 2010-03-20 20:06:38

+0

您可以通过使用< thead >和< tbody >并在您的JavaScript使用$('#mytable tbody tr')。长度应该工作。 – David 2010-03-20 20:17:46

0

每当集合发生变化时,您都可以将一组元素保存在JavaScript变量中,并在需要添加/删除元素时直接使用该数组。然后使用数组重新呈现输入元素。