Есть ли способ использовать "" во внешнем файле 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;