ASP.NET: возможно ли создавать динамически именованные функции Javascript без использования кода .NET (т. Е. VB.NET или C #)? - PullRequest
0 голосов
/ 29 августа 2011

У меня есть пользовательский элемент управления (ascx), который содержит текстовое поле и счетчик на основе Javascript, чтобы позволить пользователю знать много символов, которые он оставил для ввода. В этом элементе управления находится следующее:

function GetTextBox() {
    return document.getElementById("<%=txNotes.ClientID %>");
}

Это работало нормально, когда у нас был только один экземпляр этого пользовательского элемента управления на странице, но теперь мы должны поддерживать несколько. Как вы знаете, наличие нескольких экземпляров этого элемента управления на странице приведет к нескольким функциям GetTextBox (), только последняя из которых будет вызываться, несмотря ни на что. Для поддержки нескольких экземпляров я использую это:

if (!string.IsNullOrEmpty(TextBoxName) && !Page.ClientScript.IsClientScriptBlockRegistered(TextBoxName))
{
    string Script = string.Format("function Get{0}Notes() {{ return document.getElementById(\"{1}\"); }}", 
        TextBoxName, txNotes.ClientID);

    Page.ClientScript.RegisterClientScriptBlock(GetType(), TextBoxName, Script, true);
}

TextBoxName является публичным свойством usercontrol, поэтому, если разработчик пропустит Employee, он сгенерирует функцию Javascript с именем GetEmployeeNotes(). Это работает лучше, потому что теперь у нас может быть уникальная функция GetNotes ().

Однако мне не нравится, как это жестко запрограммировано в коде. Для этого мне нужно решение на основе разметки, которое не требует перестройки проекта на случай, если я захочу изменить Javascript. Кто-нибудь знает способ сделать это?

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

Редактировать 2 : Ответ охранника ниже сработает, но я не хочу идти по этому пути по той причине, которую я дал под его ответом. Если никто не может предложить другой способ сделать то, что я хочу, я, скорее всего, отмечу его как ответ, поскольку технически он делает именно то, что я прошу.

Ответы [ 2 ]

4 голосов
/ 29 августа 2011

Я не специалист по .NET, но разве он не работает как препроцессор?

Разве не законно писать

function Get<%=Name %>Notes() {...}

0 голосов
/ 29 августа 2011

Почему бы не использовать универсальную функцию и просто передать идентификатор соответствующего текстового поля? Как в: GetNotes (thisTextBoxId) {...}. Это не только решит вашу проблему, но и более DRY .

...