我有一个自定义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)
但我无法确切地知道代码应该是什么或应该去哪里。
答案 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?
答案 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());