Как удалить атрибут «имя» из серверных элементов управления? - PullRequest
9 голосов
/ 13 декабря 2010

Следующий код управления asp.net:

<asp:TextBox runat="server" ID="LimitTextBox" Text="20" ClientIDMode="Static" />

Генерирует такой HTML-код:

<input name="ctl11$ctl00$ctl02$TeamPlayerSelector$LimitTextBox" 
    type="text" value="20" id="LimitTextBox">

Атрибут ID - как требуется, но как я могу удалить атрибут 'name'? Это не требуется для меня, а также слишком долго, чтобы передать его в браузер пользователя.

Как я могу предотвратить генерацию атрибута name? Спасибо

P.S. Я работаю под ASP.NET 4.0

Ответы [ 6 ]

7 голосов
/ 13 декабря 2010

создайте Фильтр (класс, который наследует от Stream), назначьте его вашему атрибуту HttpContext.Response.Filter, и в нем вы перезапишите метод Write, чтобы удалить все теги имен из сгенерированного html :)

См. Эту страницу для получения дополнительной информации http://msdn.microsoft.com/en-us/library/system.web.httpresponse.filter.aspx

Обновление

Глядя на исходный код для TextBox, вы обнаруживаете, что имя фактически добавляется в список Attributes во время рендеринга, поэтому должна быть возможность вмешиваться в рендеринг класса TextBox и предотвращать использование этого атрибута. добавлено. Это должно сделать

public class NoNamesTextBox : TextBox
{
    private class NoNamesHtmlTextWriter : HtmlTextWriter
    {
        public NoNamesHtmlTextWriter(TextWriter writer) : base(writer) {}

        public override void WriteAttribute(string name, string value, bool fEncode)
        {
            if (name.Equals("name", StringComparison.OrdinalIgnoreCase)) return;

            base.WriteAttribute(name, value, fEncode);
        }
    }

    protected override void Render(HtmlTextWriter writer)
    {
        var noNamesWriter = new NoNamesHtmlTextWriter(writer);

        base.Render(noNamesWriter);
    }
}

Обновить еще раз

Как я мог забыть! Вам даже не нужно создавать подкласс вашего текстового поля. В asp.net вы можете определить, какой тип HtmlTextWriter вы хотите использовать для каждого элемента управления, поэтому вы можете просто настроить, чтобы каждый элемент управления TextBox использовал экземпляр вашего собственного NoNamesHtmlTextWriter, например,

<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter 
        controlType="System.Web.UI.WebControls.TextBox"
        adapterType="NoNamesTextBoxAdapter" 
      />
    </controlAdapters>
  </browser>
</browsers>

public class NoNamesTextBoxAdapter : ControlAdapter
{
    private class NoNamesHtmlTextWriter : HtmlTextWriter
    {
        public NoNamesHtmlTextWriter(TextWriter writer) : base(writer) { }

        public override void WriteAttribute(string name, string value, bool fEncode)
        {
            if (name.Equals("name", StringComparison.OrdinalIgnoreCase)) return;

            base.WriteAttribute(name, value, fEncode);
        }
    }

    protected override void Render(HtmlTextWriter writer)
    {
        var noNamesRender = new HtmlTextWriter(writer);
        base.Render(noNamesRender);
    }
}
3 голосов
/ 24 июня 2013

По неизвестной причине переопределение WriteAttribute не сработало. Я заменил его на:

public override void AddAttribute(HtmlTextWriterAttribute key, string value)
{
   if (key == HtmlTextWriterAttribute.Name) return;
   base.AddAttribute(key, value);
}         

И это сработало как шарм. Также, если вам просто нужно собственное имя, вы можете просто переопределить свойство UniqueID:

public class MyCustomControl : TextBox
    {

        public override string UniqueID
        {
            get
            {
                //return base.UniqueID;
                return "test123";
            }
        }


    }

Спасибо за вашу помощь!

2 голосов
/ 13 декабря 2010

Настройка EnableViewState = "False" уменьшит имя.Вы также можете создать класс, который наследует элемент управления Textbox и переопределить процедуру Render, чтобы не включать имя.

Public Class CustomTextBox
    Inherits TextBox
    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
        MyBase.Render(writer)
        'Simplified rendering of control...
        writer.WriteLine("<input type='text' id='" & MyBase.ClientID & "'>")        
    End Sub
End Class

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
     Dim MyCustomTextBox As New CustomTextBox
     form1.Controls.Add(MyCustomTextBox)
End Sub

В качестве альтернативы, если вы не хотите добавлять элемент управления во время выполнения,Вы можете сделать свой CustomTextBox в качестве ServerControl, чтобы добавить его во время разработки.

1 голос
/ 13 декабря 2010

то, что элементы управления ASP.Net отображают в атрибутах имени, происходит из свойства UniqueID. Это не обязательно хорошая идея, чтобы переопределить его, так как ASP.NET использует его для определения местоположения элемента управления при обратной передаче для маршрутизации данных и событий обратной передачи. Однако, если вы уверены, что это нормально в вашем сценарии, вы, безусловно, можете переопределить свойство UniqueID, следуя ответу @Pauli Østerø. Веселись!

0 голосов
/ 12 октября 2014

Вы можете переопределить имя свойства и вернуть все, что вы хотите (http://referencesource.microsoft.com/#System.Web/xsp/system/Web/UI/HtmlControls/HtmlInputControl.cs).

0 голосов
/ 30 апреля 2014

Я думаю, лучше изменить свойство name на такое же, как ID ..

Просто попробуйте ниже, используя Jquery на document.ready(function(){})

document.ready(function(){
  $.each($('div').children(), function() {
        $(this).attr("name",$(this).attr("id"));
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...