Есть ли способ использовать "<% = someObject.ClientID%>" во внешнем файле javascript?
Есть ли способ использовать "<% = someObject.ClientID% > " во внешнем файле javascript?
Если я использую код
<%= someObject.ClientID %>
в теге script внутри моей as (c/p) x страницы, он отлично работает. На отображаемой странице ClientID разрешен.
Howvever, если я поставлю внешний JS файл и просто добавлю:
Это не так. Есть ли способ сделать это, или я застрял в том, что оставил этот код в файле as (c/p) x?
Боковой вопрос - что такое действие <% =...% > в вашем файле разметки?
Ответы
Ответ 1
Это вполне возможно.
В своем слое презентации (ваша .aspx-страница) создайте ссылку script на странице aspx, содержащей ваш код javascript:
<script src="../MyJavaScriptFile.js.aspx" type='text/javascript'></script>
Затем в MyJavaScriptFile.js.aspx вы можете написать следующее:
<%@ Page Language="C#" AutoEventWireup="false" ContentType="text/javascript" %>
<%
CustomPersonObject cpt = new CustomPersonObject();
cpt.firstname = "John";
cpt.lastname = "Smith";
%>
// Start Javascript
var personFirstName = '<% HttpContext.Current.Response.Write(cpt.name);%>';
var personLastName = '<% HttpContext.Current.Response.Write(cpt.lastname);%>'
Одним из методов, которые я часто использую, является передача значения, которое мне нужно оценить в моем файле javascript, в качестве параметра url в исходной ссылке script:
<script src="../MyJavaScriptFile.js.aspx?username=<% somevalue %>"
type='text/javascript'></script>
Затем в MyJavaScriptFile.js.aspx я могу ссылаться на значение с помощью
<% Request.QueryString["username"] %>
Это не способ "наилучшей практики", но он выполняет свою работу так, как может понять мой мозг пещерного человека, не прибегая к причудливым обходным решениям и дополнительным кодам.
Ответ 2
Если вы действительно этого хотите, вы можете сделать следующее
<%@ Page ContentType="text/javascript" Language="C#" AutoEventWireup="false" %>
<%@ OutputCache Duration="86400" Location="Any" VaryByParam="None" %>
var time = "<%= DateTime.Now.ToString() %>";
alert(time);
И затем ссылайтесь на нее на своей странице
<script src="Scripts/file.aspx" type="text/javascript"></script>
Примечание При использовании указанного метода единственный способ передачи целевой страницы контролирует идентификаторы клиентов - это хранить идентификатор клиента как строку в общедоступном свойстве, а затем ссылаться на него с помощью нового экземпляра этой страницы
Если единственное, что заставило вас сделать это, это идентификатор клиента, то вы можете использовать следующую функцию ASP.NET 4
<any-tag ID="myCustomId" runat="server" ClientIDMode="Static" />
Вы также можете поместить все ваши идентификаторы клиентов в класс С#, а затем сериализовать его с помощью JSON и отобразить в теге script, может быть разумным способом для ASP.NET до версии 4.
Примечание, используя метод сериализации, у вас есть возможность изменить любые теги, не беспокоясь об использовании элементов JavaScript, помните, что это невозможно даже при использовании ASP.NET 4 ClientIDMode
См
Page-Code файл
public partial class About : System.Web.UI.Page
{
...
protected string GetTagIds()
{
return new JavaScriptSerializer()
.Serialize(new
{
myButton = Button1.ClientID,
myCalendar = Calendar1.ClientID
});
}
...
}
Page-ASPX
<script type="text/javascript">
var IDs = <%= GetTagIds() %>;
</script>
Везде
<script type="text/javascript">
IDs.myCalendar.doSomthing...
</script>
Есть еще один вариант, который вы можете передать всем javascript файлам в обработчик ASP.NET, но я не рекомендую его, поскольку из одного файла javascript вы делаете обработчик asp.net занятым.
Блоки кода
<% inline code% >
Это встроенное определение кода, которое вы можете выполнять в нем:
<% Response.Write("Hi"); %>
<% while(i < 0) { %>
<%
Response.Write(i.ToString());
i++;
%>
<%}%>
Примечание Вы должны включить ';' в конце каждого оператора при использовании встроенного кода с языком С# вы можете изменить встроенный язык, используя атрибут языка директивы страницы
<% = inline выражение% >
Это равно вызову Response.Запишите свое "я", см.
<%= "Hi" %> equals to <% Response.Write("Hi"); %>
Примечание Вы не должны включать ';' при использовании встроенного выражения
<%: закодированное встроенное выражение% >
Это значение равно:
Response.Write(HttpUtility.HtmlEncode("<script type="text/javascript">alert('XSS');</script>"))
И используется по соображениям безопасности --XSS, любой входной HTML для этого выводит HTML-кодированный текст, который безопасен для отображения введенного пользователем содержимого на странице.
Примечание Вы не должны включать ';' при использовании кодированного встроенного выражения
<% $expressionPrefix: выражениеField% >
Это выражение, которое вы можете использовать для привязки значений из ConnectionStrings, Resources и AppSettings
expressionPrefix возможности
- AppSettings
- ConnectionStrings
- Ресурсы
выражениеField - это свойство указанного выражения, которое вам нужно, см.:
// AppSettings
<asp:Label ... Text="<%$ AppSettings: version %>" />
// ConnectionStrings
<asp:SqlDataSource ... ConnectionString="<%$ ConnectionStrings:dbConnectionString %>" />
// Resources
<asp:Label ... Text="<%$ Resources: Messages, Welcome %>" />
Примечание Вы не должны включать ';' и вы можете использовать выражения только для атрибутов управления ASP.Net
<% # выражение привязки данных% >
Вы можете использовать это в любом месте элементов управления с поддержкой привязки данных и обычно используются методами Eval и Bind.
<asp:DropDownList SelectedValue='<%# Bind("CategoryID") %>'
DataSourceID="CategoriesDataSource"
DataTextField="CategoryName"
DataValueField="CategoryID"
runat="Server" />
Какой из них Eval или Bind?
С помощью Bind у вас есть двусторонняя привязка, установленная над указанным атрибутом элемента управления ASP.NET, см. упомянутый раскрывающийся список, он использует Bind, что означает, что конечный пользователь выбирает значение, а затем отправляет страницу, выпадающее меню будет не потеряйте его выбранное значение.
Используйте Eval только для отображения данных.
<asp:FormView ...>
<ItemTemplate>
<a href='Eval("Link")'>Eval("LinkText")</a>
</ItemTemplate>
</asp:FormView>
<% @директива шаблона текста% >
<%@ Page ...%>
This one is Page Directive
<%@ OutputCache...%>
This one is OutputCache Directive and so on...
Ответ 3
Это добавляет немного больше HTML, но это работает; оберните каждый серверный элемент управления в div...
<div id="myContainer">
<asp:HiddenField ID="hdMyControl" runat="server" /></div>
Задайте значение HiddenField в коде
hdMyControl.Value = "something";
Затем в вашем внешнем JS файле вы можете получить значение управления сервером
$(document).ready(function () {
var myValue= $('#myContainer input[type=hidden]').val();
Я не уверен, что это важно, но я добавляю ссылку script на страницу с помощью codebehind с помощью RegisterClientScriptBlock
Ответ 4
Мне нравится встраивать одну строку javascript на мою страницу.
<script type="text/javascript">
Application.init({variable1: "value1", variable2: "value2"...});
</script>
Плохая практика состоит в том, что на вашей странице отображается тонна javascript, но часто приходится передавать значения инициализации на ваш javascript с сервера. Это позволяет вам делать это без целого ряда ненужного кода и без загрязнения глобального пространства имен функциями обратного вызова. Обычно я заменяю Application
на некоторую глобальную оболочку, зависящую от проекта.
Ответ 5
Вы можете создать пустую функцию обратного вызова во внешнем файле:
var MyCallback = function () { };
И затем в asp/cx сделайте что-то вроде:
MyCallback = function () {return "<%= someObject.ClientID %>";}
И затем вернитесь во внешний файл:
var myClientID = MyCallback();
Ответ 6
Нет, это не будет работать так, потому что файл javascript передается независимо как отдельный файл, и он не анализируется ASP.NET на выходе, а ваш файл aspx IS разобран и .NET двигатель заменяет бирку w/фактическое значение.
Теперь, когда ваши объекты называют эти функции JS, то, что они могут сделать, это передать ссылки на себя в эту функцию или даже перечислить какой-либо словарь со списком со своим собственным ключом для того, что такое элемент управления и назначенное имя.
О чем еще подумать - если вы собираетесь сделать JS файл независимым от ASPX-страницы, тогда этот JS файл абсолютно не должен знать ничего о конкретных элементах управления aspx файл, который вызывает его, потому что позже кто-то другой может решить: "О, что хороший JS файл, я тоже включу его", и это не сработает для них, потому что их объекты не совпадают с вашими. Таким образом, шаблон, которому вы должны следовать, должен быть более общим - поэтому вы хотите передать ссылки или списки идентификаторов.
Ответ 7
Тег сервера <%= %>
используется для ввода кода, который обрабатывается на сервере.
Вы не можете использовать <%= someObject.ClientID %>
во внешнем js файле, потому что тег сервера - вещь asp.net, а js не знает, что это такое.
Если вы используете ASP.NET 4, вы можете установить идентификатор клиента в свойствах элемента управления, что делает его предсказуемым.
Если вы не используете ASP.NET 4, вы можете поместить этот идентификатор клиента в скрытое поле или встроенную переменную js.
Ответ 8
Используйте стандартный идентификатор префикса в исходных файлах script:
document.getElementById("ctl00_ContentDetail_textboxelename").value = "";
document.getElementById("ctl00_ContentDetail_radioORcheckboxelename").checked = false;
document.getElementById("ctl00_ContentDetail_elename").style.visibility = "hidden";
var javaele = document.getElementById("ctl00_ContentDetail_elename");
var boolIsChecked = document.getElementById("ctl00_ContentDetail_radioORcheckboxelename").checked;