Принудительная идентификация клиента в ASP.NET - PullRequest
0 голосов
/ 13 февраля 2009

Я знаю, что в следующей версии ASP.NET мы, наконец, сможем установить клиентские клиенты для элементов управления System.Web без фреймворка, делающего это для нас квазиинтеллектуальным способом, например:

id="ctl00__loginStatus__profileButton"

Кто-нибудь знает хороший метод, чтобы заставить приведенный выше идентификатор что-то вроде

id="profileButton"

Основной причиной этого является манипулирование клиентскими ссылками в jQuery при динамическом добавлении элементов управления на страницу. Проблема, которую я вижу, состоит в том, что изменение идентификаторов сломает Viewstate?

Ответы [ 6 ]

7 голосов
/ 03 ноября 2012

Вы должны использовать атрибут ClientIDMode:

<asp:xxxx ID="fileselect" runat="server" ClientIDMode="Static"/>  
6 голосов
/ 13 февраля 2009

Я обычно динамически генерирую методы javascript, которые справляются с этим. Вы можете сделать это в разметке или коде, например:

<script language="javascript" type="text/javascript">
function doXYZ()
{
   $("#" + getListBoxId()).css(...)
}

function getListBoxId()
{
 return "<%=this.myListBox.ClientId>";
}

</script>

Вы также можете встроить функции в код и зарегистрировать их.

EDIT

Пару месяцев назад мне нужно было исправить идентификатор некоторых серверных элементов управления, мне удалось его взломать и я описал свой метод здесь здесь .

По сути, вам нужно поместить элементы управления в контейнер именования, например, пользовательский элемент управления, а затем переопределить пару свойств, которые не позволяют дочерним элементам управления получить свой уникальный идентификатор.

1 голос
/ 19 октября 2009

Другим способом было бы обернуть ваш элемент управления div или span со статическим идентификатором, а затем получить доступ к элементу управления через него.

* 1003 Е.Г. *

<span id="mySpan">
<asp:TextBox id="txtTest" runat="server" />
</span>

Затем вы можете настроить таргетинг на входные теги внутри MySpan. (хотя я согласен, что было бы неплохо иметь возможность указать правильное имя, при условии, что вы могли бы обработать конфликты имен ...)

1 голос
/ 13 февраля 2009

Производительность невелика, но вы можете использовать этот синтаксис селектора для соответствия грязным идентификаторам клиентов:

$("[id$='_profileButton']")

Соответствует любому элементу , оканчивающемуся в _profileButton . Добавление начального подчеркивания гарантирует, что вы соответствуете нужному элементу, а не другому элементу, который заканчивается в подстроке "profileButton" (например, "myprofileButton").

Поскольку он должен повторяться по всему DOM, производительность может быть низкой, если вы используете его в цикле или несколько раз за раз. Если вы не злоупотребите им, влияние на производительность будет не очень значительным.

0 голосов
/ 19 октября 2009

Существует еще одно решение, не упомянутое, которое заключается в создании подклассов элементов управления ASP.NET и принудительной идентификации:

public class MyCheckBox : CheckBox
{
    public string ForcedId { get;set; }

    public override string ID
    {
        get
        {
            if (!string.IsNullOrEmpty(ForcedId))
                return ForcedId;
            else
                return base.ID;
        }
        set
        {
            base.ID = value;
        }
    }

    public override string ClientID
    {
        get
        {
            return ID;
        }
    }
}

Тогда используйте это , где вы знаете, что идентификаторы никогда не будут конфликтовать :

<mytag:MyCheckBox ForcedId="_myCheckbox" runat="server" />

Если вы используете списки, вам нужно написать ListControlAdapter, а также адаптеры для каждого типа используемого списка (выпадающий список, флажок, кнопка с переключателем, список). Либо скрестите ноги и подождите .NET 4.0.

0 голосов
/ 13 февраля 2009

Я часто сталкивался с этой "проблемой" при разработке веб-форм asp.net. В большинстве случаев я склонен использовать класс css элемента.

jQuery(".My .Container12")

Перед тем, как начать манипулировать идентификаторами, возможно, таким способом вы можете справиться с этим? Это простое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...