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
.
Ответы
Ответ 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;