Я реализую проверку Javascript на странице ASP.Net, которая находится внутри главной страницы. Идентификаторы элементов управления меняются, поэтому я не могу использовать исходные идентификаторы элементов управления для проверки. Я поискал в сети и получил предложение создать сценарий динамически и добавить его на страницу с помощью RegisterStartupScript. Мне не нравится это решение, потому что оно не обслуживается.
Как я могу выполнить проверку javascript на этой странице и указать идентификаторы клиентов?
Другое решение просто попросило меня использовать окончательные идентификаторы clientID, которые появляются в браузере. Это работоспособно, и я бы предпочел это создавать скрипт во время выполнения. Каково твое мнение?





ИМО, копирование окончательных значений ClientID, которые появляются в браузере, - это ожидающая проблема. Если вы измените идентификатор элемента управления в своем коде и забудете изменить его в своем javascript, вы можете не заметить этого, пока проверка не перестанет таинственным образом работать. Создавая его динамически, вы, по крайней мере, получите выгоду от ошибок времени компиляции.
Когда мне нужно получить доступ к идентификатору клиента элемента управления в javascript, я помещаю блок сценария вверху страницы следующим образом:
<script>
var SomeControl = <%= Control1.ClientID %>;
var AnotherControl = <%= Control2.ClientID %>;
// etc, etc.
</script>
К сожалению, это все еще кажется уродливым взломом. Предполагается, что в будущих версиях ASP.NET этот сценарий будет решен.
Другой альтернативой такой настройке javascript является создание блока сценария из кода программной части с использованием элементов управления сценариями страницы.
Лучшее решение зависит от конкретной ситуации. Самый простой и удобный способ обработки валидации в формах Asp.Net - использовать встроенные элементы управления валидацией. Они принимают идентификатор элемента управления, который вы хотите проверить, а затем обеспечивают проверку как на стороне клиента (javascript), так и на стороне сервера для этого элемента управления. Они занимаются автоматическим подключением и созданием javascript за вас.
Если по какой-то причине они не работают, и вы хотите написать свои собственные функции проверки в javascript, вам нужно будет использовать что-то похожее на решение Бранта, приведенное выше. Как упомянул Брант, используя
<%= Control1.ClientID%> in your javascript is superior to copying the final rendered control ID from the browser source because the final ID of the control changes based upon a number of factors including the ID of the control and the ID of any parent controls that it may be nested underneath (user controls, grids, repeaters, etc). The .ClientID will output the final rendered ID of the control for each circumstance. This technique may казаться like a dirty hack, but it is actually a pretty clean approach for handling the ID rewriting that is built into the framework to prevent naming collisions. This is a standard technique used on many websites.
Для меня это не похоже на хакерство.
Вполне допустимо ссылаться на ClientID с помощью встроенного кода (например, тегов <%%>). Однако приведенный пример не будет работать; вам нужно получить доступ к DOM ...
<script language = "javascript" type = "text/javascript">
var control = document.getElementById('<%= control.ClientID %>');
</script>
Здравствуйте, мне нравится это решение Роберт. Спасибо.
Вот 2 способа, которыми я пользуюсь:
в мастере:
Page.ClientScript.RegisterClientScriptInclude("somescript", ResolveUrl("some.js"));
программно:
HtmlGenericControl JScript1 = new HtmlGenericControl("script");
JScript1.Attributes.Add("type", "text/javascript");
JScript1.Attributes.Add("src", ResolveUrl("some.js"));
this.Page.Header.Controls.Add(JScript1);
Другой метод, хотя и не такой производительный, - это использование JQuery.
Поместите собственный класс css в каждый элемент управления, который вы хотите найти. Если это текстовое поле, оно может выглядеть так:
< asp:TextBox id = "NameTextBox" runat = "server" cssClass = "NameTextBox" >
Это должно поразить браузер следующим образом:
< input id = "something_NameTextBox" type = "text" class = "NameTextBox" >
Затем, используя JQuery, вы можете найти такой элемент управления:
$(".NameTextBox")
Вы можете получить значение текстового поля, используя: $(".NameTextBox").val()
Это не так эффективно, поиск элементов управления по их идентификатору выполняется быстрее, но если страница не слишком большая, это будет работать нормально.
В js-коде есть две вещи, которым нужно удовлетворить: 1. Отредактируйте код JS в удобном редакторе JS. (VS например) 2. Обеспечьте сосуществование нескольких экземпляров вашего элемента управления.
Есть общий подход к обеспечению этих двух вещей: отдельные
Общий код может быть сохранен как файл .js или как веб-ресурс, если планируется редко менять. Код, зависящий от идентификаторов, может быть организован, как в ответе Бранта, например
<script>
var <%=c1.ClientID %> = new SomeJsClass(<%=c1.ClientID %>);
var <%=c2.ClientID %> = document.getElementById('<%=c1.ClientID %>');
</script>
Код, который обрабатывает эти переменные, может находиться в отдельном файле .js.
Предполагается, что Asp.Net 4.0 имеет настраиваемый ClientId (вместо сгенерированного ClientId, как у нас сейчас) для всех веб-элементов управления ASP.Net, это изменение. И это не взлом, не бойтесь <%%>, иначе вам не понравится asp.net mvc.