Как изменить атрибут type для пользовательского элемента управления TextBox - PullRequest
2 голосов
/ 19 сентября 2011

У меня есть пользовательский элемент управления TextBox, предназначенный для приема значений валют. Я называю это CurrencyTextBox. Он отображается как , но проблема в том, что он мне нужен для отображения . Примечание. Если вам интересно, валюта не является стандартным типом, это пользовательский тип.

Вот пример кода. Все это прекрасно работает, кроме этой проблемы.

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" из отображаемой разметки. Я хочу изменить текст = "тип", чтобы сказать текст = "валюта". Достаточно просто добавить атрибут, как в

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

но он все равно отображает 'type = "text"'. Поэтому я попробовал следующее

Attributes.Remove("type");

но это не работает, просто ничего не делает.

Возможно, мне нужно использовать

protected override void RenderAttributes(HtmlTextWriter writer)

но я не могу точно определить, каким должен быть код или куда он должен идти.

Ответы [ 4 ]

3 голосов
/ 19 сентября 2011

Я никогда не слышал о типе ввода, называемом «Валюта». Вы уверены, что делаете все правильно, я уверен, что большинство браузеров не будут знать, как его отобразить ..

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

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

Конечно, самый простой способ - просто переписать Render (как вы это сделали), но вместо того, чтобы вызывать его base.Render, просто предоставить полную реализацию.

1 голос
/ 13 марта 2013

Я знаю, что вопрос старый, но я только что пришел сюда после быстрого поиска в Google, поэтому я добавлю некоторые детали для следующих посетителей:

Я попытался переопределить метод 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 после вопроса. Я использую ASP.Net на .Net 4 сегодня.

0 голосов
/ 21 сентября 2011

В конце концов я нашел ответ в другом месте, поэтому я поделюсь им здесь. Это может считаться немного хакерским, но для моих целей это хорошо. По сути, я отрисовываю элемент управления в StringBuilder, изменяю HTML (хак?), А затем выводю измененный 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());
0 голосов
/ 19 сентября 2011

Я посмотрел на System.Web.UI.WebControls.TextBox в отражателе, а метод AddAttributesToRender имеет:

writer.AddAttribute (HtmlTextWriterAttribute.Type, "text");

Таким образом, у вас есть два возможных варианта. 1. Вы можете полностью переопределить метод AddAttributesToRender или 2. Вы можете создать свой собственный тип HtmlTextWriter, который игнорирует атрибут "type" в методе AddAttribute(..., ...), и передать его в функцию AddAttributesToRender.

Мне не очень нравится вариант 1, но второй вариант будет выглядеть примерно так:

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

Кроме того, я нашел эти ссылки полезными:

ASP.NET: как удалить атрибут 'name' из серверных элементов управления?

Удаление атрибутов при рендеринге WebControl

...