假设我正确理解您,听起来您应该使用 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 又完全不同了。