在ASP.NET(C#)中,呈现和引用基于集合的表单的正确方法是什么?
我想以前有人问过这个问题(不是每个问题都有吗?),但我正在努力使用必要的语言来找到解决方案,所以这里有一些细节: 我有一个用于更新单个位置的web表单,例如街道地址、城市、州等,它通过一个静态位置更新表单来处理,该表单包含各种asp:TextBox,这些asp:TextBox在代码中使用智能控件引用,例如StreetAddressTextBox.Text 我想更新此表单以适用于多个地点。在过去,当我使用PHP时,这意味着要编写大量内联代码,其中我将表单内容包装在我呈现的集合上的for循环中,然后使用一些类似于在ASP.NET(C#)中,呈现和引用基于集合的表单的正确方法是什么?,c#,asp.net,inline,code-behind,html-rendering,C#,Asp.net,Inline,Code Behind,Html Rendering,我想以前有人问过这个问题(不是每个问题都有吗?),但我正在努力使用必要的语言来找到解决方案,所以这里有一些细节: 我有一个用于更新单个位置的web表单,例如街道地址、城市、州等,它通过一个静态位置更新表单来处理,该表单包含各种asp:TextBox,这些asp:TextBox在代码中使用智能控件引用,例如StreetAddressTextBox.Text 我想更新此表单以适用于多个地点。在过去,当我使用PHP时,这意味着要编写大量内联代码,其中我将表单内容包装在我呈现的集合上的for循环中,然后
ID=“StreetAddressTextBox”
的模式引用每个项
我目前正在ASP.NET中这样做,但是内联感觉很脏,特别是因为我必须在其他页面上创建的范例后面踢很多代码,在这些页面上表单内容没有根据集合进行缩放。我的直觉告诉我,应该有一些方法来模板出一个位置,并在代码背后做所有的事情,但我还没有偶然发现一个例子,并在实践中向我展示了这一点
感谢您事先提供的帮助。假设我正确理解您的意思,听起来您应该使用UserControl 基本上创建一个UserControl.ascx文件(VS将为您生成UserControl.designer.cs和代码隐藏类)。然后将输入字段放在其中,不带特殊属性,如下所示: (请注意,我更喜欢HTMLControl而不是WebControl,它们提供更清晰的标记,并且不会弄脏东西。我建议您尝试一下): 然后在每个需要地址表单的页面中(假设您的UserControl称为AddressControl) 注意我是如何使用“--的。ASP.NET将根据控件的父名称(等等,递归)自动生成控件名称和ID。因此,实际的HTML输入将呈现如下:
<label for="Address.Street">Street address</label>
<input type="text" name="Address_Street" id="Address.Street" />
街道地址
注意:此设计和实践仅适用于WebForms。ASP.NET MVC又完全不同了。假设我理解正确,听起来你应该使用UserControl 基本上创建一个UserControl.ascx文件(VS将为您生成UserControl.designer.cs和代码隐藏类)。然后将输入字段放在其中,不带特殊属性,如下所示: (请注意,我更喜欢HTMLControl而不是WebControl,它们提供更清晰的标记,并且不会弄脏东西。我建议您尝试一下): 然后在每个需要地址表单的页面中(假设您的UserControl称为AddressControl) 注意我是如何使用“--的。ASP.NET将根据控件的父名称(等等,递归)自动生成控件名称和ID。因此,实际的HTML输入将呈现如下:
<label for="Address.Street">Street address</label>
<input type="text" name="Address_Street" id="Address.Street" />
街道地址
注意:此设计和实践仅适用于WebForms。ASP.NET MVC又完全不同了。您可以使用
在代码隐藏中创建一个私有列表dynamicControls
在.Init()
期间,返回适合您的位置ID
要求的逻辑,以及您的字段要求
说出locationID=4
所需名称、地址1、地址2字段:
Page_Init(对象发送方,事件参数e)
{
TextBox txt=新的TextBox(){
ID=“txtName”
};
plcdynamicscontrols.Controls.Add(txt);//添加到表单
dynamicControls.Add(txt);//添加到引用列表,以避免必须执行。FindControl()
TextBox add1=新的TextBox(){
ID=“txtAddress1”
};
plcDynamicControls.Controls.Add(add1);
dynamicControls.Add(add1);
TextBox add2=新的TextBox(){
ID=“txtAddress2”
};
plcDynamicControls.Controls.Add(add2);
dynamicControls.Add(add2);
}
构建一个漂亮的循环,将这样的控件添加到占位符中
在“提交”按钮的
.Click()
事件中,您可以迭代列表动态控件
集合并处理响应。您只需使用
在代码隐藏中创建一个私有列表dynamicControls
在.Init()
期间,返回适合您的位置ID
要求的逻辑,以及您的字段要求
说出locationID=4
所需名称、地址1、地址2字段:
Page_Init(对象发送方,事件参数e)
{
TextBox txt=新的TextBox(){
ID=“txtName”
};
plcdynamicscontrols.Controls.Add(txt);//添加到表单
dynamicControls.Add(txt);//添加到引用列表,以避免必须执行。FindControl()
TextBox add1=新的TextBox(){
ID=“txtAddress1”
};
plcDynamicControls.Controls.Add(add1);
dynamicControls.Add(add1);
TextBox add2=新的TextBox(){
ID=“txtAddress2”
};
plcDynamicControls.Controls.Add(add2);
dynamicControls.Add(add2);
}
构建一个漂亮的循环,将这样的控件添加到占位符中
在提交按钮的
.Click()
事件中,您可以迭代列表动态控件
集合并处理响应。这就是您要查找的吗?www.4guysfromrolla.com/articles/081402-1.aspxDataBinding和GenericDataSourceControl(非常棒!)是你的朋友。用户控件可以很好地创建“新作用域”,因为它们引入了一个新的NamingContainer。@bUKaneer更接近了。我不确定表单控件如何放置在表单中,以及如何生成div之类的东西来包含它们。一旦我们开始讨论特定的控件生成,这听起来很像javascript的工作。我想应该有
<%@ Page blargh %>
<p>Enter your address details below:</p>
<foo:Address runat="server" id="Address" />
public override void OnLoad(Object sender, EventArgs e) {
if( Page.IsPostBack ) {
Validate();
if( Page.IsValid ) {
// get values from a POST
String street = this.Address.Street.Value;
String city = this.Address.City.Value;
// and so on
}
} else {
// set values if you're retrieving data from a DB or something
this.Address.Street.Value = "123 Fake Street";
this.Address.City.Value = "Frying Pan City";
}
}
<label for="Address.Street">Street address</label>
<input type="text" name="Address_Street" id="Address.Street" />