Есть ли способ использовать «<% = someObject.ClientID%>» во внешнем файле JavaScript? - PullRequest
32 голосов
/ 01 июля 2011

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

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

<%= someObject.ClientID %>

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

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

Дополнительный вопрос - как называется действие <% = ...%> в вашем файле разметки?

Ответы [ 8 ]

32 голосов
/ 01 июля 2011

Если вы действительно хотите это сделать, вы можете сделать следующее

<%@ 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" />

Вы также можете поместить все свои клиентские идентификаторы в класс C #, затем сериализовать их с помощью JSON и отобразить их в теге script, что может быть разумным способом для ASP.NET до версии 4.

Примечание используя метод сериализации, у вас есть возможность изменить любой идентификатор тега , не беспокоясь об использовании элементов javascript, помните, что это даже невозможно с ASP.NET 4 ClientIDMode

См

Page-Code-File

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>

Anywhere

<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 # вы можете изменить встроенный язык, используя атрибут языка директивы страницы

<% = встроенное выражение%>

Это равносильно вызову Response. Напишите себя, см .:

<%= "Hi" %> equals to <% Response.Write("Hi"); %>

Примечание Вы не должны включать ';' при использовании встроенного выражения

<%: закодированное встроенное выражение%>

Это равняется:

Response.Write(HttpUtility.HtmlEncode("<script type="text/javascript">alert('XSS');</script>"))

И используется в целях безопасности - XSS , любой входной HTML-код для этого выводит HTML-кодированный текст, который безопасен для отображения введенного пользователем содержимого на странице.

Примечание Вы не должны включать ';' при использовании закодированного встроенного выражения

<% $ expressionPrefix: expressionField%>

Это выражение, которое вы можете использовать для привязки значений из 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?

Используя 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...
20 голосов
/ 01 июля 2011

Это вполне возможно.

На вашем уровне представления (вашей странице .aspx) создайте ссылку на скрипт на страницу 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"] %>

Это не "лучший метод", как делать вещи, но он выполняет работу так, как мой мозг пещерного человека может понять, не прибегая к причудливым обходным путям и дополнительному коду.

3 голосов
/ 17 июля 2013

Это добавляет немного больше 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();

Я не уверен, что это имеет значение, но я добавляю ссылку на скрипт на страницу через код, используя RegisterClientScriptBlock

3 голосов
/ 01 июля 2011

Мне нравится вставлять одну строчку javascript на мою страницу.

<script type="text/javascript">
   Application.init({variable1: "value1", variable2: "value2"...});
</script>

Плохо практиковать отображение тонны javascript на вашей странице, но обычно необходимо передавать значения инициализации в ваш javascript с сервера. Это позволяет вам делать это без целой связки ненужного кода и без загрязнения глобального пространства имен функциями обратного вызова. Я обычно заменяю Application на какую-то глобальную оболочку для конкретного проекта.

1 голос
/ 01 июля 2011

Серверный тег <%= %> используется для ввода кода, который обрабатывается на сервере.

Вы не можете использовать <%= someObject.ClientID %> во внешнем js-файле, потому что серверный тег является элементом asp.net, а jsне знает, что это такое.

Если вы используете ASP.NET 4, вы можете установить идентификатор клиента в свойствах элемента управления, делая его предсказуемым.

Если вы не используете ASP.NET 4 вы можете поместить этот идентификатор клиента в скрытое поле или встроенную переменную js.

1 голос
/ 01 июля 2011

Нет, это не будет работать так, потому что файл javascript передается независимо как отдельный файл, и он не анализируется ASP.NET при выходе, в то время как ваш файл aspx анализируется и .NET двигатель заменяет тег с фактическим значением.

Теперь, когда ваши объекты вызывают эти функции JS, они могли бы передавать ссылки на себя в функцию или даже передавать какой-либо словарный список с вашим собственным ключом для обозначения элемента управления и назначенного имени.

Стоит также подумать - если вы собираетесь сделать файл JS независимым от страницы ASPX, то этот файл JS абсолютно не должен предполагать, что он знает что-либо о конкретных элементах управления aspx. файл, который вызывает его - потому что позже кто-то другой может решить: «О, это хороший файл JS, я тоже его включу», и он не будет работать для них, потому что их объекты не будут совпадать с вашими. Таким образом, шаблон, которому вы должны следовать, должен быть более общим - поэтому вы должны передавать ссылки или списки идентификаторов.

1 голос
/ 01 июля 2011

Вы можете создать пустую функцию обратного вызова во внешнем файле:

var MyCallback = function () { };

А затем в asp / cx сделать что-то вроде:

MyCallback = function () {return "<%= someObject.ClientID %>";}

И затем вернуться ввнешний файл:

var myClientID = MyCallback();
0 голосов
/ 21 марта 2012

Используйте стандартный идентификатор префикса в исходных файлах скрипта:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...