0

我想这个问题之前已经被问过(不是每个问题吗?),但我正在努力寻找解决方案所需的语言,所以这里有一些细节:

我有一个用于更新单个位置的 Web 表单,例如街道地址、城市、州等,这是通过使用带有各种 asp:TextBoxes 的静态位置更新表单来处理的,这些 asp:TextBoxes 在代码隐藏中使用它们的智能感知控件,例如 StreetAddressTextBox.Text。

我想更新此表格以适用于多个地点。过去,当我使用 PHP 时,这意味着要编写大量内联代码,其中我将表单内容包装在我正在呈现的集合上的 for 循环中,然后使用ID="StreetAddressTextBox_<%=locationId%>"类似模式的模式引用每个项目。

我目前正在 ASP.NET 中这样做,但内联感觉很脏,特别是因为我必须踢掉很多我在其他页面上建立的代码隐藏范例,而表单内容不是基于集合进行缩放。我的直觉告诉我应该有某种方法来模板化一个位置并在代码隐藏中做所有事情,但我还没有偶然发现和示例在实践中向我展示了这一点。

感谢您提前提供任何帮助。

4

2 回答 2

4

假设我正确理解您,听起来您应该使用 UserControl。

基本上创建一个 UserControl.ascx 文件(VS 将为您生成 UserControl.designer.cs 和代码隐藏类)。然后将您的输入字段放在那里,没有特殊属性,如下所示:

(请注意,我更喜欢 HtmlControls 而不是 WebControls,它们提供更清晰的标记并且不会弄脏东西。我建议你试一试):

<%@ Control blargh %>
<label for="<%= Street.ClientID %>">Street address</label>
<input type="text" runat="server" id="Street" /> <br />

<label for="<%= City.ClientID %>">Town / City</label>
<input type="text" runat="server" id="City" /> <br />

<!-- etc -->

请注意我没有弄乱id=""输入控件的属性。现在只需在您的 web.config 中注册它:

<add tagPrefix="foo" tagName="Address" src="~/Controls/Address.ascx" />

然后在每个需要地址表单的页面中(假设您的 UserControl 称为 AddressControl)

<%@ 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";
      }
 }

请注意我是如何使用“<%= Street.ClientID %>”的东西。ASP.NET 将根据控件的父名称(以此类推,递归方式)自动生成控件名称和 ID。因此,实际的 HTML 输入将呈现如下:

<label for="Address.Street">Street address</label>
<input type="text" name="Address_Street" id="Address.Street" />

请注意,这种设计和做法仅适用于 WebForms。ASP.NET MVC 又完全不同了。

于 2012-09-13T23:58:42.207 回答
0

你可以只使用一个<asp:PlaceHolder runat="server" id="plcDynamicControls" />.

在您的代码后面创建一个private List<WebControl> dynamicControls.

.Init()退货期间,无论您的要求是什么逻辑locationID,以及您的现场要求可能是什么。

说出locationID = 4必填的姓名、地址 1、地址 2 字段:

Page_Init(object Sender, EventArgs e) 
{
    TextBox txt = new TextBox(){
        ID = "txtName"    
    };
    plcDynamicControls.Controls.Add(txt); //Add to Form
    dynamicControls.Add(txt); //Add to reference list, to avoid having to do .FindControl()

    TextBox add1 = new TextBox(){
        ID = "txtAddress1"    
    };
    plcDynamicControls.Controls.Add(add1); 
    dynamicControls.Add(add1); 

    TextBox add2 = new TextBox(){
        ID = "txtAddress2"    
    };
    plcDynamicControls.Controls.Add(add2);
    dynamicControls.Add(add2); 
}

构建一个很好的循环来将这样的控件添加到您的占位符中。

在您.Click()的提交按钮事件中,您可以遍历List<WebControl> dynamicControls集合并处理响应。

于 2012-09-14T04:22:46.880 回答