2013-08-16 25 views
3

我正在尝试使用Asp.net 3.5/IIS执行以下操作:JavaScript Asp.net重复控件

具有顶级可重复表单的Web表单。所以基本上是一个Order-> Products-> ProductsParts类的scenerio。订单只有一个。产品是可重复的。每个产品都有可重复的产品部件。产品和产品部分有一大堆领域,所以我不能使用网格。

因此,我在每个产品部件的每个产品添加/删除按钮中添加/删除产品按钮。

这是我的要求。在使用jquery/js进行一些研究之后,我已经能够实现添加/删除。我如何在服务器上捕获这些数据?由于JavaScript是添加和删除这些控件,他们不是服务器端,我不知道如何正确地分配名称属性。我正在尝试下面的JavaScript,但它不工作。任何帮助表示赞赏:

function onAddProperty(btnObject){ 
var previous = btnObject.prev('div'); 
var propertyCount = jquery.data(document.body, 'propertyCount'); 

var newDiv = previous.clone(true).find("*[name]").andSelf().each(function() { $(this).attr("name").replace(($(this).attr("name").match(/\[[0-9]+\]/), cntr)); }); ; 

propertyCount++; 
jquery.data(document.body, 'propertyCount', propertyCount); 

//keep only one unit and remove rest 
var children = newDiv.find('#pnlUnits > #pnlUnitRepeater'); 
var unitCount = children.length; 
var first = children.first(); 
for (i = 1; i < unitCount; i++) { 
    children[i].remove(); 
} 

newDiv.id = "pnlPropertySlider_" + propertyCount; 

newDiv.insertBefore(btnObject); 
} 

我需要name属性指定为阵列,这样我可以在的Request.Form

帮助,请阅读!

强大的文本修复不更新不工作IDS:

var newDiv = previous.clone(true).find("input,select").each(function() { 
    $(this).attr({ 
     'name': function() { 
      var name = $(this).attr('name'); 
      if (!name) return ''; 
      return name.replace(/property\[[0-9]+\]/, 'property' + propertyCount); 
     } 
    }); 
}).end().insertBefore(btnObject); 
+0

这种类型的东西应该工作。如果您使用Request.Form,您将有权访问所有带有回传名称的输入。你所遇到的问题是命名,但是如果没有看到你的html,我不能帮你太多。 –

+0

Request.Form没有动态创建的控件。我检查了每个属性,包括HtmlNameValue对或其他东西。但是我在其他地方找到的解决方案基本上是使用jquery来序列化表单并进行回发。我检查了哪些浏览器发布,它没有任何动态控制。所以,基本上你不能使用ASP.Nets提交表单机制,它肯定会从视图状态获取信息。我必须尝试禁用视图状态。我会张贴我的发现 – ASR

回答

0

问题看起来像以下行:

$(this).attr("name").replace(($(this).attr("name").match(/\[[0-9]+\]/), cntr)); 

这种说法没有做任何事情。 JavaScript中的字符串是不可变的,并且.replace仅返回字符串,并替换某些内容。

你将不得不以实际设置attr("name")到具有替代价值的新的字符串: http://api.jquery.com/attr/

我不禁更加没有看到你的HTML。

+0

Tx的结果。我能够使用下面的代码来解决它。 – ASR