Подтвердить что ты не робот

Asp.net 4.0: есть ли какой-либо эквивалент ClientIDMode для имен INPUT?

У меня есть asp:ListView, для ClientIDMode которого задано значение Predictable. Его ItemTemplate содержит asp:textbox.

Идентификатор текстового поля действует, как я ожидаю, но его name все еще использует то, что выглядит как алгоритм в стиле AutoID:

<input name="lvFields$ctrl0$tbVal" id="lvFields_tbVal_somekey" type="text"/>

Есть ли способ, по которому я могу заставить имя ввода действовать как идентификатор?

(Изменить в ответ на вопросы ниже:)

Элемент ввода name - это то, что в данных POST, поэтому, если postback изменяет список, к которому привязан ListView (например, обмениваясь двумя элементами), значения из текстовых полей в конечном итоге связаны с неправильным потому что структура коррелирует их на основе name, а не ID.

4b9b3361

Ответ 1

Вы можете изменить имя входа, используя метод из следующего сообщения, но слегка изменив его:

как удалить атрибут 'name' от элементов управления сервера?

Я перегрузил метод RenderChildren в элементе управления Page, так как мне просто нужен полный контроль над HTML для нескольких элементов управления:

protected override void RenderChildren(HtmlTextWriter writer)
{
    var unScrewNamesRender = new RenderBasicNameHtmlTextWriter(writer);
    base.RenderChildren(unScrewNamesRender);
}

private class RenderBasicNameHtmlTextWriter : HtmlTextWriter
{
    public RenderBasicNameHtmlTextWriter(TextWriter writer) : base(writer) { }

    public override void AddAttribute(HtmlTextWriterAttribute key, string value)
    {
        if (key == HtmlTextWriterAttribute.Name && value.Contains("POLine"))
        {
            value = value.Substring(value.LastIndexOf("$") + 1);
        }

        base.AddAttribute(key, value);
    }
}

Вам нужно знать, что вы делаете, если вы попытаетесь это сделать, WebForms будет считать, что элемент управления отсутствует, поэтому вы не можете использовать его в каких-либо обратных передачах. Для моих целей, когда я хотел добавить произвольное количество нескольких строк на сервере или на стороне клиента, не имея дело с элементами управления .Net Ajax, он отлично работает.

Ответ 2

Я уверен, что вы не можете изменить имя, особенно когда вы изменяете ClientIDMode. В качестве альтернативы вы можете добавить атрибут Title. VS будет обозначать это как неизвестное в коде на стороне сервера, но он корректно отображает HTML. Если вы делаете некоторые манипуляции на стороне клиента, вы можете адресовать вход как таковой:

<script type="text/javascript">
$(document).ready(function () {
$('input:text[title="TextBoxName"]').datepicker();
});
</script>

Ответ 3

Насколько я знаю, нет способа изменить имя входного элемента. Имя соответствует свойству UniqueID, которое генерируется системой и которое вы не контролируете. Кажется, вам нужно найти способ добиться того, что вам нужно использовать только идентификатор элемента управления.

Ответ 4

Оба имени используют предсказуемый шаблон; Первоначально имя также равно ct100_ct100 и т.д. Из того, что я вижу, это предсказуемое имя. Идентификатор клиента всегда будет использовать _ между префиксами управления и уникальным идентификатором (имя атрибута) всегда будет использовать $. Они всегда будут совпадать, за исключением нескольких элементов управления, которые используют имя для чего-то (используется для группировки радиокассетников).

НТН.

Ответ 5

У меня была одна и та же проблема один раз, и мне пришлось использовать одно из этих свойств, открытое в "System.Web.UI.Control", чтобы получить имя управляющего клиента на стороне сервера.

Играйте с этими свойствами и создайте "Имя" на стороне сервера самостоятельно и используйте Request.Form( "NameHere" )

Me.ClientIDSeparator
Me.IdSeparator
Me.UniqueID

Ответ 6

Решение jquery

 function removeNameAttribute() {
            $('input, select').each(function () {
                $(this).removeAttr("name");
            });
        }

Ответ 7

//Используйте HtmlGenericControl

HtmlGenericControl input = new HtmlGenericControl("input");``
input.ID = "lvFields_tbVal_somekey";
input.Attributes.Add("name", "tbVal");
input.Attributes.Add("type", "text");
input.ClientIDMode = ClientIDMode.Static;