2011-11-28 87 views
0

我制作了自定义文本框,它从文本框继承。无法通过javascript访问自定义文本框属性

using System.Drawing; 
    using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Linq; 
    using System.Text; 
    using System.Web; 
    using System.Web.UI; 
    using System.Web.UI.WebControls; 

    namespace GNB.DPS.MVAD.CustomWebControls 
    { 
     [Designer("GNB.DPS.MVAD.CustomWebControls.MVADTextBox, GNB.DPS.MVAD.CustomWebControls"), DefaultProperty("Text"), ToolboxData("<{0}:MVADTextBox runat=server></{0}:MVADTextBox>")] 
     public class MVADTextBox : TextBox 
     { 
      public virtual string SampleText 
      { 
       get 
       { 
        string s = (string)ViewState["SampleText"]; 
        return s ?? String.Empty; 
       } 
       set 
       { 
        ViewState["SampleText"] = value; 
       } 
      } 

      [Bindable(false)] 
      [Category("Properties")] 
      [DefaultValue("")] 
      [Localizable(true)] 
      public string Mask 
      { 
       get 
       { 
        String tblName = (String)ViewState["Mask"]; 
        return (Mask ?? String.Empty); 
       } 

       set 
       { 
        ViewState["Mask"] = value; 
       } 
      } 

      protected override void OnLoad(EventArgs e) 
      { 
       if(!Page.IsPostBack) 
       { 
        if(Text == String.Empty) 
        { 
         if (SampleText != "") 
         { 
          CssClass = "sampleText"; 
          this.Text = SampleText; 
          var onFocus = "<script language=\"javascript\">function ClearField(input) { if(input.value == input.defaultValue){input.value = \"\"; input.className = 'regularText';} } </script>"; 
          var onBlur = "<script language=\"javascript\"> function PopulateField(input) {if (input.value == \"\") {input.value = input.defaultValue; input.className = 'sampleText'; } } </script>"; 

          Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "OnFocus", onFocus); 
          this.Attributes.Add("onfocus", "ClearField(this);"); 

          Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "OnBlur", onBlur); 
          this.Attributes.Add("onblur", "PopulateField(this);"); 
         } 
        } 
       } 
      } 
     } 
    } 

在它可被用作例如在.aspx ...

<script language="javascript"> 
    function MaskInput(input) { 
     var textbox = document.getElementById(input.id); 
     var mask = textbox.getAttribute('Mask'); 

    } 
</script> 

    <MVAD:MVADTextBox ID="tbMVAD2" runat="server" SampleText="Hello" Mask="###-###" onKeyPress="MaskInput(this);" /> 

然而...这一行返回null变种掩模= textbox.getAttribute( '掩模');

在我们看到的视图源

...

<input name="ctl00$cphListBody$tbMVAD2" type="text" value="Hello" id="ctl00_cphListBody_tbMVAD2" class="sampleText" onKeyPress="MaskInput(this);" onfocus="ClearField(this);" onblur="PopulateField(this);" /> 

通知如何有一个名为面膜或示例文本源没有财产。因此我无法通过javascript访问该属性。我的控制设置正确吗?有任何想法吗?

回答

1

我认为你在客户端和服务器端有很大的混淆。 “掩码”属性仅在.NET(服务器端),并且您正试图从JavaScript(客户端)读取它。 “mask”属性不会呈现。您可以修改“OnLoad”方法来添加它,或者按照Gabriel的回答建议,简单地在事件上传递属性。

protected override void OnLoad(EventArgs e) 
{ 
    if(!Page.IsPostBack) 
     { 
      if(Text == String.Empty) 
      { 
       if (SampleText != "") 
       { 
          CssClass = "sampleText"; 
          this.Text = SampleText; 
          var onFocus = "<script language=\"javascript\">function ClearField(input) { if(input.value == input.defaultValue){input.value = \"\"; input.className = 'regularText';} } </script>"; 
          var onBlur = "<script language=\"javascript\"> function PopulateField(input) {if (input.value == \"\") {input.value = input.defaultValue; input.className = 'sampleText'; } } </script>"; 

          Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "OnFocus", onFocus); 
          this.Attributes.Add("onfocus", "ClearField(this);"); 

          Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "OnBlur", onBlur); 
          this.Attributes.Add("onblur", "PopulateField(this);"); 

          this.Attributes.Add("Mask", this.Mask); 
         } 
        } 
       } 
      } 

编辑:

public string Mask 
      { 
       get 
       { 
        String tblName = (String)ViewState["Mask"]; 
        return (Mask ?? String.Empty); // This is causing your stack overflow... 
       } 
      } 
+0

“你可以修改”OnLoad“方法来添加它”这是怎么完成的?this.Attributes.Add(“Mask”,Mask)“我想要做onKeyPress =”MaskInput(this,Mask);但是这不起作用。 ; this.Attributes.Add(“SampleText”,SampleText);当我尝试这个时,我在这一行上得到了一个stackoverflow异常... String tblName =(String)ViewState [“Mask”]; – joncodo

+0

this.Attributes.Add(“ Mask“,this.Mask);应该可以工作 – lluismontero

+0

也可以看一下你的Mask getter方法,因为它的实现没有意义,请检查一下,因为是什么导致你的堆栈溢出,我编辑了我的答案。 – lluismontero

0

把你的面具里面的功能是这样的:

<script language="javascript"> 
    function MaskInput(input, mask) { 
     var textbox = document.getElementById(input.id); 
    } 
</script> 

    <MVAD:MVADTextBox ID="tbMVAD2" runat="server" SampleText="Hello" onKeyPress="MaskInput(this, '###-###');" /> 

您的自定义属性具有构建视图时,你asp.net应用程序忽略豆。

+0

这样做是可以肯定的,但我想要的代码被隐藏。这里的最终目标是在文本框中不使用onkeypress,而只是将Mask =“### - ###”作为文本框的属性。我打算通过onload方法中的控件的.cs添加onkeypress属性到控件。就像我为示例文本所做的那样。 – joncodo