2011-09-19 14 views
2

通貨の値を受け入れるためのカスタムTextBoxコントロールがあります。私はそれをCurrencyTextBoxと呼んでいます。 <入力タイプ= "text" .../>と表示されますが、問題は<入力タイプ= "通貨" .../>をレンダリングする必要があります。注 - 「通貨」は標準タイプではなく、カスタムタイプです。カスタムTextBoxコントロールの 'type'属性を変更する方法

ここにいくつかのコードのサンプルがあります。この1つの問題とは別に、すべて正常に動作します。

"type"属性をレンダリングされたマークアップから変更する方法を検討するのは苦労しています。私はtext = "type"をtext = "currency"と言うように変更したい。 それはちょうど

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

のように、属性を追加することは簡単ですが、それはまだ「タイプ= 『テキスト』」をレンダリングします。だから私は次を試した:

Attributes.Remove("type"); 

しかし、それは何もしないだけで動作します。

おそらく、私は

protected override void RenderAttributes(HtmlTextWriter writer) 

を使用する必要がありますが、私は、コードがどうあるべきか、それが行くべき場所を正確に何かを動作することはできません。私は「通貨」と呼ばれる入力タイプのことを聞いたことがない

+0

タイプは予約されているため、ブラウザは入力の「タイプ」(ボタン、テキストなど)を推測できます。なぜあなたが望むものと一致するformat、mask、inputStyleのような独自の属性を作成しないでください。 type = "Text" inputStyle = "currency" –

答えて

3

は、あなたが正しいことをやっているあなたは確かであるが、私はほとんどのブラウザがそれをレンダリングする方法が分からないだろうかなり確信している。..

http://www.w3schools.com/html/html_forms.aspもちろん

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

、最も簡単な方法は、ただ単に完全な実装を提供し、(あなたがやったように)レンダリング、代わりbase.Renderだ、それを呼び出すので上書きすることです。

0

Iは、反射器にSystem.Web.UI.WebControls.TextBoxを見てAddAttributesToRender方法はあります

writer.AddAttribute(HtmlTextWriterAttribute.Type、 "テキスト")。

2つの選択肢が残っています。 1. AddAttributesToRenderメソッドを完全に上書きすることができます。または、AddAttribute(..., ...)メソッドの "type"属性を無視して、AddAttributesToRender関数に渡す独自のHtmlTextWriterタイプを作成することができます。

私は本当にオプション1好きではないが、オプション2のようになります:

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

あなたの返事をありがとう。問題は、属性が2回レンダリングされることになります。つまり、type = "text" type = "currency"です。私は "type = 'text'"を失い、 "type = 'currency'"を保持したい " – Matt

+0

私が上記で提供したソリューションの両方は、一度だけ出力する必要があります。私は 'AddAttributesToRender'関数を完全にオーバーライドするのは大変な作業だと思っていますが、カスタムHtmlTextWriterを作成し、' AddAttribute(...、...) '関数の動作を変更してname 'HtmlTextWriterAttribute.Type'と値" text "(この比較では大文字小文字を無視します)。本当にあなたはそのチェックをすることができます。値が "text"のその名前( "タイプ")がない場合は、単にスーパーを呼び出すことができます。あなたのために働く何かを見つけたように見えます。 – Sam

0

結局私は答えを見つけたので、ここでそれを分かち合うつもりです。ちょっとハッキリだと思うかもしれませんが、私の目的のためには大丈夫です。基本的には、コントロールをStringBuilderにレンダリングし、HTML(hacky?)を変更して、変更されたHTMLを出力します。私が知っている

//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

を質問は古いですが、私 -

ので、(私の質問のように)「レンダリング」メソッドで、このコードで次の行

base.Render(writer); 

をREPLACEグーグル検索後すぐにここに来ましたので、次の訪問者のためにいくつかの詳細を追加します:

レンダリング方法をそのようにオーバーライドしようとしましたが、それはうまく機能しました。

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版で変更されたことがあります。私はASP.netを.NET 4で今日使用しています。

関連する問題