标签的 .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为何不起作用

为啥高度参数在标签小部件中不起作用?

Kivy 标签中的断线不起作用(Python)

调整文本大小时 HTML 标记不起作用

JQuery 在 Django 自定义模板标签的模板中不起作用

javascript代码在HEAD标签中不起作用