2011-09-19 133 views
2

我有一個用於接受貨幣值的自定義TextBox控件。我稱之爲CurrencyTextBox。它呈現爲< input type =「text」.../>但問題是我需要它來渲染< input type =「currency」.../>。注 - 如果您想知道,「貨幣」不是標準類型,它是一種自定義類型。如何更改自定義TextBox控件的'type'屬性

下面是一些代碼的示例。除了這個問題之外,它一切正常。

public class CurrencyTextBox : TextBox 
{ 
    protected override void OnPreRender(EventArgs e) 
    { 
     //I have some code in here to render client side scripts 
    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     writer.AddAttribute("onfocus", "__ctbFocus(this);"); 
     writer.AddAttribute("onkeydown", "return __ctbKeyDown(this);"); 
     writer.AddAttribute("onkeypress", "return __ctbKeyPress(this);"); 
     writer.AddAttribute("onchange", "return __ctbChange(this)"); 


     //I have more code here which adds several more attributes 

     base.Render(writer); 

    } 
} 

我在努力研究如何從呈現的標記中更改「type」屬性。我想改變text =「type」來說text =「currency」。 這是很容易只添加屬性,如

writer.AddAttribute("text", "currency") 

,但它仍然呈現「類型=‘文本’」。所以我嘗試了以下內容

Attributes.Remove("type"); 

但這不起作用,它只是沒有做任何事情。

也許我需要使用

protected override void RenderAttributes(HtmlTextWriter writer) 

,但我不能工作了什麼代碼應該還是它應該去。

+0

類型是保留的東西,因此瀏覽器可以推斷輸入的「類型」(按鈕,文本等)。爲什麼不創建自己的屬性,如:格式,掩碼,inputStyle匹配你想要的。 type =「Text」inputStyle =「currency」 –

回答

0

我在反射器看着System.Web.UI.WebControls.TextBox和AddAttributesToRender方法具有:

writer.AddAttribute(HtmlTextWriterAttribute.Type, 「文本」);

所以,你剩下兩個可能的選擇。 1.您可以完全覆蓋AddAttributesToRender方法或2.您可以創建自己的HtmlTextWriter類型,該類型忽略AddAttribute(..., ...)方法中的「類型」屬性並將其傳遞到AddAttributesToRender函數。

我真的不喜歡選項1,但方案二看起來是這樣的:

protected override void AddAttributesToRender(HtmlTextWriter writer) 
{ 
    HtmlTextWriter coolWriter = new MyCoolHtmlTextWriter(writer); 
    base.AddAttributesToRender(coolWriter); 
} 

另外,我發現這些鏈接有用:

ASP.NET: how to remove 'name' attribute from server controls?

Removing Attributes on Rendering WebControl

+0

感謝您的回覆。問題是我結束了屬性被渲染兩次 - type =「text」type =「currency」。我想失去「type ='text'」並保留「type ='currency'」 – Matt

+0

我上面提供的兩種解決方案應該只輸出一次。我認爲完全覆蓋'AddAttributesToRender'函數將會工作太多,但我真的很喜歡創建自定義HtmlTextWriter並修改AddAttribute(...,...)函數的行爲來放棄名稱屬性的想法'HtmlTextWriterAttribute.Type'和值「text」(在這個比較中忽略大小寫)。真的,你可以做這個檢查,如果它沒有名稱(「類型」)的值「文本」,你可以稱之爲超級。看起來你發現了一些適合你的東西。 – Sam

0

最終我在別處找到了答案,所以我會在這裏分享。這可能會被認爲有點hacky,但爲了我的目的,這很好。本質上,我將控件呈現給StringBuilder,修改HTML(hacky?),然後輸出修改過的HTML。

因此,在「渲染」的方法(如我的問題所示),替換下面的行

base.Render(writer); 

與此代碼 -

//change type="text" to type="currency" 
var sbHTML = new StringBuilder(); 
var swHTML = new StringWriter(sbHTML); 
HtmlTextWriter htwHTML = new HtmlTextWriter(swHTML); 
base.Render(htwHTML); 
sbHTML.Replace("type=\"text\"", "type=\"currency\""); 
writer.Write(sbHTML.ToString()); 
1

我知道這個問題是舊的,但我剛剛來到這裏後,快速谷歌搜索,所以我會爲下一個訪客添加一些細節:

我試圖覆蓋Render方法,並且它運作良好

public class NumberInput : System.Web.UI.WebControls.TextBox 
{ 
    protected override void Render(System.Web.UI.HtmlTextWriter writer) 
    { 
     writer.AddAttribute("type", "number"); 

     base.Render(writer); 
    } 
} 

自問題以來,也許某些東西因.Net版本而改變。我今天在.Net 4上使用ASP.Net。