有没有办法在外部 javascript 文件中使用“<%= someObject.ClientID %>”?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6542079/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-23 22:12:55  来源:igfitidea点击:

Is there a way to use "<%= someObject.ClientID %>" in an external javascript file?

javascriptasp.netascxclientid

提问by Matt

Is there a way to use "<%= someObject.ClientID %>" in an external javascript file?

有没有办法在外部 javascript 文件中使用“<%= someObject.ClientID %>”?

If I use the code

如果我使用代码

<%= someObject.ClientID %>

in a script tag inside my as(c/p)x page, it works fine. On the rendered page, the ClientID is resolved. Howvever, if I put in an external JS file and just add:

在我的 as(c/p)x 页面内的脚本标记中,它工作正常。在呈现的页面上,ClientID 已解析。但是,如果我放入一个外部 JS 文件并添加:

It doesn't. Is there a way to do this or am I stuck with leaving that code in the as(c/p)x file?

它没有。有没有办法做到这一点,或者我是否坚持将该代码留在 as(c/p)x 文件中?

Side question -- what is the act of doing <%=... %> in your markup file called?

附带问题 - 在标记文件中执行 <%=... %> 的行为是什么?

采纳答案by Daniel Szabo

This is totally possible.

这是完全可能的。

In your .aspx page, create a script reference to an aspx pagethat contains your javascript code:

在您的 .aspx 页面中,创建对包含您的 javascript 代码的aspx 页面的脚本引用:

<script src="../MyJavaScriptFile.js.aspx" type='text/javascript'></script>

Then, in MyJavaScriptFile.js.aspx you can write the following:

然后,在 MyJavaScriptFile.js.aspx 中,您可以编写以下内容:

<%@ Page Language="C#" AutoEventWireup="false"  ContentType="text/javascript" %>

<% 
    var foo = new Whatever();
    foo.ClientId = 123;
%>

// Start Javascript
var clientId = <% HttpContext.Current.Response.Write(foo.ClientId); %>;

.

.

Also helpful - this technique supports querystring parameters:

也很有帮助 - 此技术支持查询字符串参数:

 <script src="../MyJavaScriptFile.js.aspx?username=<% somevalue %>" 
       type='text/javascript'></script>

Then, in MyJavaScriptFile.js.aspx, I can reference the value with

然后,在 MyJavaScriptFile.js.aspx 中,我可以引用该值

var username = '<% Request.QueryString["username"] %>';

It's not the "best practice" way to do things, but it gets the job done in a way that my caveman brain can understand without resorting to fancy workarounds.

这不是做事的“最佳实践”方式,但它以我的穴居人大脑可以理解的方式完成工作,而无需求助于花哨的解决方法。

回答by Beygi

If you really want to do this you can do following

如果你真的想这样做,你可以做以下

<%@ Page ContentType="text/javascript" Language="C#" AutoEventWireup="false" %>
<%@ OutputCache Duration="86400" Location="Any" VaryByParam="None" %>

var time = "<%= DateTime.Now.ToString() %>";
alert(time);

And then reference it in your page

然后在您的页面中引用它

<script src="Scripts/file.aspx" type="text/javascript"></script>

NoteWhen using mentioned method, the only way to pass target page controls client-ids, is to store client id as string in a public property, and then reference it using new instance of that page

注意使用上述方法时,传递目标页面控件客户端 ID 的唯一方法是将客户端 ID 作为字符串存储在公共属性中,然后使用该页面的新实例引用它

If the only thing that made you to do this is client-id then you can use following ASP.NET 4 feature

如果让您这样做的唯一原因是客户端 ID,那么您可以使用以下 ASP.NET 4 功能

<any-tag ID="myCustomId" runat="server" ClientIDMode="Static" />

You can also put all your client-ids in C# class then serialize it using JSON and render it in script tag, could be smart way for ASP.NET prior to version 4.

您还可以将所有客户端 ID 放在 C# 类中,然后使用 JSON 对其进行序列化并将其呈现在脚本标记中,这对于 ASP.NET 版本 4 之前的版本来说可能是一种明智的方式。

Noteusing serialization method you have possibility to change any tag idswithout worrying about javascript element usages, remember that this is not even possible with ASP.NET 4 ClientIDMode

请注意,使用序列化方法,您可以更改任何标签 ID,而无需担心 javascript 元素的使用,请记住,这在 ASP.NET 4 ClientIDMode 中甚至是不可能的

See

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

页面-ASPX

<script type="text/javascript">
    var IDs = <%= GetTagIds() %>;
</script>

Anywhere

任何地方

<script type="text/javascript">
    IDs.myCalendar.doSomthing...
</script>

There is another option that you can pass all javascript files to ASP.NET handler but i don't recommend it, because of just a single javascript file you make asp.net handler busy.

还有另一种选择,您可以将所有 javascript 文件传递​​给 ASP.NET 处理程序,但我不推荐它,因为只有一个 javascript 文件会使 ASP.NET 处理程序忙碌。

Code Blocks

代码块

<% inline code %>

<% 内联代码 %>

This is an inline code definition which you can execute codes in it :

这是一个内联代码定义,您可以在其中执行代码:

<% Response.Write("Hi"); %>

<% while(i < 0) { %>
      <% 
         Response.Write(i.ToString()); 
         i++;
      %>
<%}%>

NoteYou have to include ';' on end of each statement when using inline code with C# language, you can change inline language using page directive language attribute

注意你必须包括';' 在 C# 语言中使用内联代码时,在每个语句的末尾,您可以使用页面指令语言属性更改内联语言

<%= inline expression %>

<%= 内联表达式 %>

This one equals to calling Response.Write your self, see:

这相当于调用Response.Write你自己,见:

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

NoteYou shouldn't include ';' when using inline expression

注意你不应该包括';' 使用内联表达式时

<%: encoded inline expression %>

<%: 编码的内联表达式 %>

This one equals to :

这相当于:

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

And is used for security reasons --XSS, any input HTML to this one outputs HTML encoded text which is safe to display user entered contents in page.

并且出于安全原因使用--XSS,此输入的任何 HTML 都会输出 HTML 编码的文本,可以安全地在页面中显示用户输入的内容。

NoteYou shouldn't include ';' when using encoded inline expression

注意你不应该包括';' 使用编码的内联表达式时

<%$ expressionPrefix: expressionField %>

<%$ 表达式前缀:表达式字段 %>

This one is expression that you can use to bind values from ConnectionStrings, Resources and AppSettings

这是一个表达式,您可以使用它来绑定来自 ConnectionStrings、Resources 和 AppSettings 的值

expressionPrefix possibilities is

表达式前缀的可能性是

  • AppSettings
  • ConnectionStrings
  • Resources
  • 应用设置
  • 连接字符串
  • 资源

expressionField is the property of specified expressionPrefix that you need, see:

expressionField 是您需要的指定 expressionPrefix 的属性,请参阅:

// AppSettings
<asp:Label ... Text="<%$ AppSettings: version %>" />

// ConnectionStrings
<asp:SqlDataSource ... ConnectionString="<%$ ConnectionStrings:dbConnectionString %>" />

// Resources
<asp:Label ... Text="<%$ Resources: Messages, Welcome %>" />

NoteYou shouldn't include ';' and you can use expressions only on ASP.Net controls attributes

注意你不应该包括';' 并且您只能在 ASP.Net 控件属性上使用表达式

<%# data-binding expression %>

<%# 数据绑定表达式 %>

You can use this anywhere inside controls with data-binding support, and usually is used by Eval and Bind methods.

您可以在具有数据绑定支持的控件内的任何位置使用它,并且通常由 Eval 和 Bind 方法使用。

<asp:DropDownList SelectedValue='<%# Bind("CategoryID") %>' 
                  DataSourceID="CategoriesDataSource"
                  DataTextField="CategoryName"
                  DataValueField="CategoryID"
                  runat="Server" />

Which one Eval or Bind?

哪一个是 Eval 或 Bind?

Using Bind you have two-way binding set over specified attribute of ASP.NET control see the mentioned drop-down, it is using Bind that means if end-user selects a value and then submit the page, drop-down will not loose its selected value.

使用 Bind 您可以通过 ASP.NET 控件的指定属性设置双向绑定,请参阅提到的下拉列表,使用 Bind 意味着如果最终用户选择一个值然后提交页面,下拉列表不会丢失其选定的值。

Use Eval just for displaying data.

使用 Eval 仅用于显示数据。

<asp:FormView ...>
     <ItemTemplate>
          <a href='Eval("Link")'>Eval("LinkText")</a>
     </ItemTemplate>
</asp:FormView>

<%@ text template directive %>

<%@ 文本模板指令 %>

<%@ Page ...%>
This one is Page Directive

<%@ OutputCache...%>
This one is OutputCache Directive and so on...

回答by jesse reiss

I like to embed a single line of javascript on my page.

我喜欢在我的页面上嵌入一行 javascript。

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

It's poor practice to have a ton of javascript rendered on your page, but it is common to need to pass initialization values to your javascript from the server. This allows you to do it without a whole bunch of unnecessary code and without polluting the global namespace with callback functions. I usually replace Applicationwith some project specific global wrapper.

在您的页面上呈现大量 javascript 是一种糟糕的做法,但通常需要将初始化值从服务器传递给您的 javascript。这允许您在没有一大堆不必要的代码的情况下完成它,并且不会用回调函数污染全局命名空间。我通常Application用一些项目特定的全局包装器替换。

回答by Mark B

This adds a bit more HTML but it works; wrap each server control in a div...

这添加了更多的 HTML,但它有效;将每个服务器控件包装在一个 div 中...

<div id="myContainer">
    <asp:HiddenField ID="hdMyControl" runat="server" /></div>

Set the HiddenField's value in the code behind

在后面的代码中设置 HiddenField 的值

hdMyControl.Value = "something";

Then in your external JS file you can get the server control's value

然后在您的外部 JS 文件中,您可以获得服务器控件的值

$(document).ready(function () {
    var myValue= $('#myContainer input[type=hidden]').val();

I'm not sure that it matters, but I'm adding the script reference to the page via the codebehind using RegisterClientScriptBlock

我不确定它是否重要,但我正在通过代码隐藏使用添加脚本引用到页面 RegisterClientScriptBlock

回答by Michael

You could create an empty callback function in the external file:

您可以在外部文件中创建一个空的回调函数:

var MyCallback = function () { };

And then in the asp/cx do something like:

然后在 asp/cx 中执行以下操作:

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

And then, back in your external file:

然后,回到您的外部文件:

var myClientID = MyCallback();

回答by The Evil Greebo

No, it won't work like that because the javascript file is being transmitted independently as a separate file and it isn't parsed by ASP.NET on the way out, while your aspx file IS being parsed and the .NET engine is replacing the tag w/ the actual value.

不,它不会像那样工作,因为 javascript 文件是作为一个单独的文件独立传输的,并且在输出时不会被 ASP.NET 解析,而您的 aspx 文件正在被解析并且 .NET 引擎正在替换带有实际值的标签。

Now when your objects call those JS functions, what they could do is pass references to themselves into the function, or even pass in a dictionary list of some sort with your own key for what the control is and the assigned name.

现在,当您的对象调用这些 JS 函数时,它们可以做的是将对其自身的引用传递到该函数中,或者甚至将带有您自己的键的某种字典列表传递给控件和分配的名称。

One thing to think about as well - IF you are going to make a JS file independent of an ASPX page, then that JS file absolutelyshould not presume to know anything about the specific controls of the aspx file that calls it - because later on someone else might decide, "Oh that's a good JS file, I'll incorporate it too" and it won't work for them cause their objects wont match yours. Thus the pattern you should follow would have to be more generic - thus why you'd want to pass in references or lists of identifiers.

还需要考虑的一件事 - 如果您要制作一个独立于 ASPX 页面的 JS 文件,那么该 JS 文件绝对不应该假定知道调用它的 aspx 文件的特定控件的任何信息 - 因为稍后有人否则可能会决定,“哦,这是一个很好的 JS 文件,我也会合并它”,这对他们不起作用,因为他们的对象与您的对象不匹配。因此,您应该遵循的模式必须更加通用 - 这就是为什么您要传入引用或标识符列表的原因。

回答by dexter

The server tag <%= %>is used to enter code that is processed on the server.

服务器标签<%= %>用于输入在服务器上处理的代码。

You cannot use <%= someObject.ClientID %>in an external js file because the server tag is an asp.net thing and js doesn't know what this is.

您不能<%= someObject.ClientID %>在外部 js 文件中使用,因为服务器标记是一个 asp.net 的东西,而 js 不知道这是什么。

If you use ASP.NET 4 you can set the client id in the properties of the control making it predictable.

如果您使用 ASP.NET 4,您可以在控件的属性中设置客户端 ID,使其可预测。

If you don't use ASP.NET 4 you could put this client id in a hidden field or an inline js variable.

如果您不使用 ASP.NET 4,您可以将此客户端 ID 放在隐藏字段或内联 js 变量中。

回答by Steve Velpel

Use the standard prefix identifier in script source files:

在脚本源文件中使用标准前缀标识符:

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;