我在应用程序中创建用户配置文件有以下要求:
用户应该能够在他的个人资料中输入多个电话号码/电子邮件地址
屏幕看起来有点像这样:
- 默认情况下,在页面加载时会显示一个用于电话和电子邮件的文本框
- 用户可以单击“+”按钮添加其他号码/地址
- 单击“+”按钮时,我们需要在第一个下方添加另一个文本框。用户可以根据需要添加任意数量的数字/地址。提交时,服务器应收集所有数字/电子邮件并将其保存在数据库中。
我尝试使用Repeater控件执行此操作。在page_load上,我将转发器绑定到一个大小为1的“新arraylist”对象。因此,这呈现得很好 - 用户看到一个没有值的文本框。
当他点击“+”按钮时,理想情况下我想使用javascript创建更多带有与第一个类似标记的文本框。
我的问题是这些:
来自Struts / JSP背景,我仍然在努力控制.NET的做事方式 - 所以任何帮助都会受到赞赏。
答案 0 :(得分:4)
转发器控制对于您要完成的任务可能有点过分。它主要是指用于呈现数据行的数据绑定控件。
您可以做的是在Page_Load
事件(C#)中动态创建框:
TestInput.aspx:
<form id="form1" runat="server">
<asp:HiddenField ID="hdnAddInput" runat="server" />
<asp:Button ID="btnPlus" OnClientClick="setAdd()" Text="Plus" runat="server" />
<asp:PlaceHolder ID="phInputs" runat="server" />
</form>
<script type="text/javascript">
function setAdd() {
var add = document.getElementById('<%=hdnAddInput.ClientID%>');
add.value = '1';
return true;
}
</script>
TestInput.aspx.cs:
protected void Page_Load(object sender, EventArgs e)
{
if (ViewState["inputs"] == null)
ViewState["inputs"] = 1;
if (hdnAddInput.Value == "1")
{
ViewState["inputs"] = int.Parse(ViewState["inputs"].ToString()) + 1;
hdnAddInput.Value = "";
}
for (int loop = 0; loop < int.Parse(ViewState["inputs"].ToString()); loop++)
phInputs.Controls.Add(new TextBox() { ID = "phone" + loop });
}
我最终使用PlaceHolder
动态添加文本框,并在需要添加其他HiddenField
时标记TextBox
。由于ID是匹配的,因此它会在每次回发期间维护控件的ViewState。
答案 1 :(得分:2)
欢迎使用ASP.NET中动态添加控件的毛球。它不漂亮,但可以做到。
您无法使用javascript动态添加新字段,因为新字段在页面的服务器端控件集合中没有任何表示。
鉴于要求是用户可以添加到页面的地址数量没有限制,您唯一的选择是执行“传统”动态ASP.NET控件。这意味着您必须通过new
处理控制服务器端的添加 - 使用新的对象来表示控件:
private ArrayList _dynamicControls = new ArrayList();
public void Page_Init()
{
foreach (string c in _dynamicControls)
{
TextBox txtDynamicBox = new TextBox();
txtDynamicBox.ID = c;
Controls.Add(txtDynamicBox);
}
}
public void AddNewTextBox()
{
TextBox txtNewBox = new TextBox();
txtNewBox.ID = [uniqueID] // Give the textbox a unique name
Controls.Add(txtNewBox);
_dynamicControls.Add([uniqueID]);
}
您可以在此处看到,支持每个动态添加字段的对象必须添加回每个回发上的Page 的Controls集合。如果你不这样做,那么从现场发回的数据无处可去。
答案 2 :(得分:0)
如果你想使用转发器,我认为最简单的方法是将转发器放在ASP.Net AJAX更新面板中,在服务器端添加额外的文本框。
如果不使用转发器,还有其他方法可以实现这一点,使用js添加文本框可能更容易。
答案 3 :(得分:0)
不,但您可以创建与input
控件所呈现的TextBox
元素类似的元素。
没有。 ASP.NET保护自己免受发布到服务器的虚假数据的影响。您不能通过添加它将返回的数据来使服务器代码认为它之前创建了TextBox
。
方法错了。你试图采取不起作用的中间方式。你必须向任何一个方向前进。要么回发并在服务器端添加TextBox
,要么在客户端完全执行,并使用Request.Form
集合在服务器端接收数据。