asp.net 4.0: есть ли эквивалент ClientIDMode для имен входов? - PullRequest
16 голосов
/ 11 февраля 2011

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

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

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

Есть ли способ для меня, чтобы имя входа действовало так же, как идентификатор?

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

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

Ответы [ 7 ]

2 голосов
/ 11 июля 2012

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

как удалить атрибут '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, он работает нормально.

1 голос
/ 17 января 2012

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

<script type="text/javascript">
$(document).ready(function () {
$('input:text[title="TextBoxName"]').datepicker();
});
</script>
0 голосов
/ 12 октября 2016

// Использовать 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;
0 голосов
/ 13 ноября 2013

Решение jquery

 function removeNameAttribute() {
            $('input, select').each(function () {
                $(this).removeAttr("name");
            });
        }
0 голосов
/ 21 декабря 2011

Однажды у меня была точно такая же проблема, и мне пришлось использовать одно из этих свойств, представленных в "System.Web.UI.Control", чтобы получить имя клиентского элемента управления на стороне сервера.создайте «Имя» на стороне сервера и используйте Request.Form («NameHere»)

Me.ClientIDSeparator
Me.IdSeparator
Me.UniqueID
0 голосов
/ 11 июня 2011

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

НТН.

0 голосов
/ 11 июня 2011

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

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