Есть ли способ использовать "" во внешнем файле javascript?
есть ли способ использовать " " во внешнем файле javascript?
Если я использую код
<%= someObject.ClientID %>
в теге скрипта внутри моей страницы as(c/p)x он работает нормально. На отображаемой странице ClientID разрешен. Однако, если я помещу внешний JS-файл и просто добавлю:
это не так. Есть ли способ сделать это или я застрял с оставлением этого кода в файле as(c/p)x?
боковой вопрос -- Что такое акт выполнения в вашем файле разметки называется?
8 ответов
это вполне возможно.
в вашем слое презентации (ваш .aspx page), создайте ссылку скрипта на страницу 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 src="../MyJavaScriptFile.js.aspx?username=<% somevalue %>"
type='text/javascript'></script>
тогда, в MyJavaScriptFile.js.aspx, я могу ссылаться на значение с
<% Request.QueryString["username"] %>
это не лучший способ сделать что-то, но он выполняет работу таким образом, что мой пещерный мозг может понять, не прибегая к причудливым обходным путям и дополнительному коду.
если вы действительно хотите сделать это, вы можете сделать следующее
<%@ 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>
Примечание при использовании упомянутого метода единственный способ передать целевые элементы управления страницами client-ids-это сохранить идентификатор клиента как строку в общедоступном свойстве, а затем ссылаться на него с помощью нового экземпляра этой страницы
если единственное, что заставило вас сделать это клиент-id, то вы можно использовать следующие ASP.NET 4 особенность
<any-tag ID="myCustomId" runat="server" ClientIDMode="Static" />
вы также можете поместить все свои идентификаторы клиента в класс C#, а затем сериализовать его с помощью JSON и отобразить его в теге скрипта, может быть умным способом для ASP.NET до версии 4.
Примечание используя метод сериализации, у вас есть возможность изменения любых идентификаторов тегов не беспокоясь об использовании элементов javascript, помните, что это даже невозможно с ASP.NET 4 ClientIDMode
посмотреть
Страница-Код-Файл
public partial class About : System.Web.UI.Page
{
...
protected string GetTagIds()
{
return new JavaScriptSerializer()
.Serialize(new
{
myButton = Button1.ClientID,
myCalendar = Calendar1.ClientID
});
}
...
}
страница-ASPX
<script type="text/javascript">
var IDs = <%= GetTagIds() %>;
</script>
в любом месте
<script type="text/javascript">
IDs.myCalendar.doSomthing...
</script>
есть еще один вариант, который вы можете передать все файлы javascript ASP.NET обработчик, но я не рекомендую его, потому что вы делаете только один файл javascript asp.net обработчик занят.
Код Блока
это рядные определение кода, который вы можете выполнить коды в нем:
<% Response.Write("Hi"); %>
<% while(i < 0) { %>
<%
Response.Write(i.ToString());
i++;
%>
<%}%>
Примечание вы должны включить"; " в конце каждого оператора при использовании встроенного кода с языком C# вы можете изменить встроенный язык, используя атрибут языка директивы страницы
это равно вызову ответа.Напиши сам, смотри:
<%= "Hi" %> equals to <% Response.Write("Hi"); %>
Примечание вы не должны включать ';' при использовании встроенного выражение
этот равен:
Response.Write(HttpUtility.HtmlEncode("<script type="text/javascript">alert('XSS');</script>"))
и используется по соображениям безопасности --XSS, любой входной HTML для этого выводит HTML-кодированный текст, который безопасен для отображения введенного пользователем содержимого на странице.
Примечание вы не следует включать ';' при использовании закодированного встроенного выражения
это выражение, которое можно использовать для привязки значений из ConnectionStrings, Resources и AppSettings
возможности expressionPrefix-это
- параметр appsettings
- ConnectionStrings
- ресурсы
expressionField является собственностью указанного expressionPrefix, который вам нужен, см.:
// 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, у вас есть двусторонняя привязка, установленная над указанным атрибутом 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...
мне нравится вставлять одну строку javascript на мою страницу.
<script type="text/javascript">
Application.init({variable1: "value1", variable2: "value2"...});
</script>
это плохая практика, чтобы иметь тонну javascript, отображаемую на Вашей странице, но обычно необходимо передавать значения инициализации на ваш javascript с сервера. Это позволяет сделать это без целой кучи ненужного кода и без загрязнения глобального пространства имен функциями обратного вызова. Я обычно заменяю Application
С некоторой глобальной оболочкой проекта.
это добавляет немного больше 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();
Я не уверен, что это имеет значение, но я добавляю ссылку на скрипт на страницу через codebehind, используя RegisterClientScriptBlock
нет, это не будет работать так, потому что файл javascript передается независимо как отдельный файл, и он не анализируется ASP.NET на выходе, в то время как ваш файл aspx анализируется и .NET engine заменяет тег с фактическим значением.
теперь, когда ваши объекты вызывают эти функции JS, то, что они могут сделать, это передать ссылки на себя в функцию или даже передать в списке словарей какой-то свой собственный ключ для того, что такое элемент управления и присвоенное имя.
одна вещь, о которой нужно подумать - если вы собираетесь сделать JS-файл независимым от страницы ASPX, то этот JS-файл абсолютно не следует предполагать, что вы знаете что - либо о конкретных элементах управления файлом aspx, который его вызывает, потому что позже кто-то другой может решить: "О, это хороший файл JS, я тоже включу его", и он не будет работать для них, потому что их объекты не будут соответствовать вашим. Таким образом, шаблон, которому вы должны следовать, должен быть больше generic-таким образом, почему вы хотите передать ссылки или списки идентификаторов.
сервер тег <%= %>
используется для ввода кода, который обрабатывается на сервере.
вы не можете использовать <%= someObject.ClientID %>
во внешнем js-файле, потому что тег сервера является asp.net вещь и js не знают, что это такое.
Если вы используете ASP.NET 4 можно задать идентификатор клиента в свойствах элемента управления, что делает его предсказуемым.
Если вы не используете ASP.NET 4 Вы можете поместить этот идентификатор клиента в скрытое поле или встроенную переменную js.
вы можете создать пустую функцию обратного вызова во внешний файл:
var MyCallback = function () { };
а затем в asp/cx сделайте что-то вроде:
MyCallback = function () {return "<%= someObject.ClientID %>";}
и затем, обратно во внешний файл:
var myClientID = MyCallback();
используйте стандартный идентификатор префикса в исходных файлах скрипта:
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;