Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ASP.NET(C#)中,呈现和引用基于集合的表单的正确方法是什么?_C#_Asp.net_Inline_Code Behind_Html Rendering - Fatal编程技术网

在ASP.NET(C#)中,呈现和引用基于集合的表单的正确方法是什么?

在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循环中,然后

我想以前有人问过这个问题(不是每个问题都有吗?),但我正在努力使用必要的语言来找到解决方案,所以这里有一些细节:

我有一个用于更新单个位置的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" />