标签的 .text 字段不起作用
Posted
技术标签:
【中文标题】标签的 .text 字段不起作用【英文标题】:.text field for label not working 【发布时间】:2011-11-18 20:18:07 【问题描述】:我有一个为表单生成标签输入对的自定义控件。我希望该标签的文本由名称字段而不是 ID 字段控制。但是,当我进入自定义控件并明确设置标签的文本字段等于名称时,标签的文本始终是我的自定义控件的 ID。为什么?
页面上的表单:
<FormUpgrade:FormUpgrade ID="fname" type="text" name="First Name" runat="server" />
在我的oninit
函数中,我有以下几行:
aLabel.Text = name;
this.Controls.Add(this.aLabel);
aLabel
在那之后就再也没有被碰过。
但是,如果我手动键入标签字段,则文本字段的行为与预期相同。
这是整个自定义控件的代码:
namespace FormUpgrade
[DefaultProperty("Text")]
[ToolboxData("<0:FormUpgrade runat=server></0:FormUpgrade>")]
public class FormUpgrade : WebControl
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public Label aLabel = new Label();
public TextBox aField = new TextBox();
public RegularExpressionValidator regexvalid = new RegularExpressionValidator();
protected override void OnInit(EventArgs e)
regexvalid.ID = ID + "_validator";
if (!String.IsNullOrEmpty(ID))
aField.ID = ID+"_box";
aLabel.ID = ID + "_label";
aLabel.AssociatedControlID = aLabel.ID;
//aField.Attributes.Add("runat", "server");
// aLabel.Attributes.Add("runat", "server");
if (!String.IsNullOrEmpty(required))
aField.Attributes.Add("required", required);
if (required.Equals("required"))
aLabel.Attributes.Add("class", "required");
if (!String.IsNullOrEmpty(name))
aField.Attributes.Add("name", name);
aLabel.Text = name;
else
aLabel.Text = ID;
if (!String.IsNullOrEmpty(placeholder))
aField.Attributes.Add("placeholder", placeholder);
if (!String.IsNullOrEmpty(role))
aField.Attributes.Add("role", role);
if (!String.IsNullOrEmpty(maxlength))
aField.Attributes.Add("maxlength", maxlength);
if (!String.IsNullOrEmpty(placeholder))
aField.Attributes.Add("placeholder", placeholder);
aLabel.Attributes.Add("for", ID+"_box");
if (!String.IsNullOrEmpty(type))
aField.Attributes.Add("type", type);
//if (type.Equals("date"))
//
// aField.Attributes.Add("class", "hasDatepicker");
//
if(type.Equals("textarea"))
aField.TextMode = TextBoxMode.MultiLine;
if (type.Equals("password"))
aField.TextMode = TextBoxMode.Password;
aLabel.Text = name;
this.Controls.Add(this.aLabel);
this.Controls.Add(this.aField);
if(type.Equals("email"))
regexvalid.ValidationExpression = "[a-zA-Z0-9]+([-+.][a-zA-Z0-9]+)*@[a-zA-Z0-9]+([-.][a-zA-Z0-9]+)*.[a-zA-Z0-9]+([-.][a-zA-Z0-9]+)*";
regexvalid.ControlToValidate = ID+"_box";
regexvalid.ErrorMessage = "Not a valid email address <br>";
this.Controls.Add(regexvalid);
else if (type.Equals("url"))
regexvalid.ValidationExpression = "http(s)?://([a-zA-Z0-9-]+.)+[a-zA-Z0-9-]+(/[a-zA-Z0-9- ./?%&=]*)?";
regexvalid.ControlToValidate = ID + "_box";
regexvalid.ErrorMessage = "Not a valid URL<br>";
this.Controls.Add(regexvalid);
else if(!String.IsNullOrEmpty(ValidationExpression))
regexvalid.ControlToValidate = ID + "_box";
regexvalid.ValidationExpression = ValidationExpression;
if (!String.IsNullOrEmpty(ValidationErrorMessage))
regexvalid.ErrorMessage = ValidationErrorMessage + "<br>";
this.Controls.Add(regexvalid);
base.OnInit(e);
public string Text
get
String s = (String)ViewState["Text"];
return ((s == null) ? "[" + this.ID + "]" : s);
set
ViewState["Text"] = value;
public string type
get
String s = (String)ViewState["type"];
return ((s == null) ? "[" + this.ID + "]" : s);
set
ViewState["type"] = value;
public string name
get
String s = (String)ViewState["name"];
return ((s == null) ? "" : s);
set
ViewState["name"] = value;
public string required
get
String s = (String)ViewState["required"];
return ((s == null) ? "" : s);
set
ViewState["required"] = value;
public string role
get
String s = (String)ViewState["role"];
return ((s == null) ? "" : s);
set
ViewState["role"] = value;
public string ValidationExpression
get
String s = (String)ViewState["ValidationExpression"];
return ((s == null) ? "" : s);
set
ViewState["ValidationExpression"] = value;
public string ValidationErrorMessage
get
String s = (String)ViewState["ValidationErrorMessage"];
return ((s == null) ? "" : s);
set
ViewState["ValidationErrorMessage"] = value;
public string placeholder
get
String s = (String)ViewState["placeholder"];
return ((s == null) ? "" : s);
set
ViewState["placeholder"] = value;
public string Display
get
String s = (String)ViewState["Display"];
return ((s == null) ? "" : s);
set
ViewState["Display"] = value;
public string maxlength
get
String s = (String)ViewState["maxlength"];
return ((s == null) ? "" : s);
set
ViewState["maxlength"] = value;
public string Value
get
String s = (String)ViewState["Value"];
return ((s == null) ? "" : s);
set
ViewState["Value"] = value;
public override void RenderBeginTag(htmlTextWriter writer)
public override void RenderEndTag(HtmlTextWriter writer)
【问题讨论】:
我之前不知道官方接受功能。 常见问题解答中:***.com/faq#howtoask 【参考方案1】:看起来问题可能就在这里:
public string Text
get
String s = (String)ViewState["Text"];
return ((s == null) ? "[" + this.ID + "]" : s);
set
ViewState["Text"] = value;
我认为s
正在返回 null,而是返回 ID。如果Text
为空,请尝试只返回一个空字符串。
【讨论】:
我很困惑,我唯一调用 text 的时候是调用 aLabel.Text,而不是 fname.Text。 也许我很困惑。究竟是什么问题?在没有任何上下文的情况下概念化您的控件有点困难,但我认为这可能会发生,因为您在 ViewState 重新加载之前设置了OnInit
中的值。你的Text
属性是用来做什么的?
在 Visual Studio 中创建控件时默认提供 text 属性。我没有将它用于任何事情,在我的 oninit 文件中,我从不调用实例变量“文本”。我正在使用一个控件来创建标签、输入和正则表达式验证器。我希望自定义控件中的名称组件确定标签显示的文本。不幸的是,标签显示的内容是由 ID 变量而不是 name 变量决定的。以上是关于标签的 .text 字段不起作用的主要内容,如果未能解决你的问题,请参考以下文章
CSS span标签里面的text-indent为何不起作用