如何更改自定义TextBox控件的“type”属性

时间:2011-09-19 16:28:36

标签: asp.net custom-controls

我有一个自定义TextBox控件,用于接受货币值。我称之为CurrencyTextBox。它呈现为< input type =“text”... />但问题是我需要它来渲染< input type =“currency”... />。注意 - 如果您想知道“货币”不是标准类型,则它是自定义类型。

以下是一些代码的示例。除了这一个问题,这一切都很好。

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")

但它仍然呈现'type =“text”'。所以我尝试了以下

Attributes.Remove("type");

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

也许我需要使用

protected override void RenderAttributes(HtmlTextWriter writer)

但我无法确切地知道代码应该是什么或应该去哪里。

4 个答案:

答案 0 :(得分:3)

我从来没有听说过一种名为'货币'的输入类型你确定你做的是正确的,我很确定大多数浏览器都不知道如何渲染它。

http://www.w3schools.com/html/html_forms.asp

http://www.w3schools.com/html5/html5_form_input_types.asp

当然,最简单的方法就是覆盖Render(就像你已经完成的那样),而不是调用它的base.Render,只提供完整的实现。

答案 1 :(得分: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。

答案 2 :(得分:0)

我查看了反射器中的System.Web.UI.WebControls.TextBox,AddAttributesToRender方法有:

  

writer.AddAttribute(HtmlTextWriterAttribute.Type,“text”);

所以你有两种可能的选择。 1.您可以完全覆盖AddAttributesToRender方法,或2.您可以创建自己的HtmlTextWriter类型,忽略AddAttribute(..., ...)方法中的“type”属性并将其传递给{{ 1}}功能。

我不太喜欢选项1,但选项二看起来像是:

AddAttributesToRender

另外,我发现这些链接很有用:

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

Removing Attributes on Rendering WebControl

答案 3 :(得分: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());