2011-09-19 134 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。