2011-11-28 125 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