Подтвердить что ты не робот

Есть ли способ использовать "<% = someObject.ClientID%>" во внешнем файле javascript?

Есть ли способ использовать "<% = someObject.ClientID% > " во внешнем файле javascript?

Если я использую код

<%= someObject.ClientID %>

в теге script внутри моей as (c/p) x страницы, он отлично работает. На отображаемой странице ClientID разрешен. Howvever, если я поставлю внешний JS файл и просто добавлю:

Это не так. Есть ли способ сделать это, или я застрял в том, что оставил этот код в файле as (c/p) x?

Боковой вопрос - что такое действие <% =...% > в вашем файле разметки?

4b9b3361

Ответ 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;