有没有一种方法可以使用<;%=someObject.ClientID%>&引用;在外部javascript文件中?

有没有一种方法可以使用<;%=someObject.ClientID%>&引用;在外部javascript文件中?,javascript,asp.net,ascx,clientid,Javascript,Asp.net,Ascx,Clientid,有没有办法在外部javascript文件中使用“” 如果我使用代码 <%= someObject.ClientID %> 在我的as(c/p)x页面中的脚本标记中,它可以正常工作。在呈现的页面上,将解析ClientID。 然而,如果我放入一个外部JS文件,只需添加: 没有。有什么方法可以做到这一点,还是我必须将代码留在as(c/p)x文件中 附带问题--在名为的标记文件中执行的操作是什么?您可以在外部文件中创建一个空回调函数: var MyCallback = functio

有没有办法在外部javascript文件中使用“”

如果我使用代码

<%= someObject.ClientID %>

在我的as(c/p)x页面中的脚本标记中,它可以正常工作。在呈现的页面上,将解析ClientID。 然而,如果我放入一个外部JS文件,只需添加:

没有。有什么方法可以做到这一点,还是我必须将代码留在as(c/p)x文件中


附带问题--在名为的标记文件中执行的操作是什么?

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

var MyCallback = function () { };
然后在asp/cx中执行以下操作:

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

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

现在,当您的对象调用这些JS函数时,它们可以做的是将对自身的引用传递到函数中,或者甚至使用您自己的键传递某种字典列表,以确定控件是什么以及指定的名称

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

服务器标记
用于输入在服务器上处理的代码

您不能在外部js文件中使用
,因为服务器标记是asp.net的东西,而js不知道这是什么

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


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

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

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

init({variable1:“value1”,variable2:“value2”…});

在页面上呈现大量javascript是一种糟糕的做法,但通常需要从服务器向javascript传递初始化值。这使您无需编写大量不必要的代码,也无需使用回调函数污染全局命名空间。我通常用一些特定于项目的全局包装器来替换
应用程序

这是完全可能的

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

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

然后,在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); %>;

//启动Javascript
var clientId=;

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

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

然后,在MyJavaScriptFile.js.aspx中,我可以使用

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

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

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

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

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

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

var-id=;
任何地方

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

ID.myCalendar.doSomthing。。。
还有另一个选项,您可以将所有javascript文件传递给ASP.NET处理程序,但我不建议这样做,因为只有一个javascript文件会让ASP.NET处理程序很忙

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

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

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

注意您必须包括“;”在将内联代码与C#语言一起使用时,在每条语句的末尾,您可以使用page directive language属性更改内联语言

这等于呼叫响应。写下你自己,参见:

<%= "Hi" %> equals to <% Response.Write("Hi"); %>
等于
注意你不应该包括“;”使用内联表达式时

这个等于:

Response.Write(HttpUtility.HtmlEncode("<script type="text/javascript">alert('XSS');</script>"))
Response.Write(HttpUtility.HtmlEncode(“警报('XSS');”)
并用于安全原因——XSS,任何输入到该HTML的HTML都会输出HTML编码的文本,可以安全地在页面中显示用户输入的内容

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

这个表达式可用于绑定ConnectionString、Resources和AppSettings中的值

expressionPrefix可能是

  • 应用程序设置
  • 连接字符串
  • 资源
expressionField是所需的指定expressionPrefix的属性,请参见:

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

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

// Resources
<asp:Label ... Text="<%$ Resources: Messages, Welcome %>" />
//应用程序设置

这个是页面指令
这是OutputCache指令等等。。。

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

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;

这增加了一点HTML,但它可以工作;将每个服务器控件包装在一个div中

<div id="myContainer">
    <asp:HiddenField ID="hdMyControl" runat="server" /></div>
然后在外部JS文件中,您可以获得服务器控件的值

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

我不确定这是否重要,但我正在使用
RegisterClientScriptBlock

JS通过codebehind将脚本引用添加到页面中。ASP.NET运行时不处理JS文件,因此它无法工作。我也讨厌大量的内联代码,因为这。。。您可以创建函数并传递参数,但服务器端块不能进入JS文件。当然,有一种方法可以配置IIS,使JS文件也能通过与aspx/ashx文件相同的管道?有这么多好的答案,谢谢大家!:-)@我自己,我想这不是一个真正的回调,而是一个函数变量?钩子?委托?如果您只是想处理ASP.NET构建服务器控件id的方式,而不想每次都找到它们
// AppSettings
<asp:Label ... Text="<%$ AppSettings: version %>" />

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

// Resources
<asp:Label ... Text="<%$ Resources: Messages, Welcome %>" />
<asp:DropDownList SelectedValue='<%# Bind("CategoryID") %>' 
                  DataSourceID="CategoriesDataSource"
                  DataTextField="CategoryName"
                  DataValueField="CategoryID"
                  runat="Server" />
<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...
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;
<div id="myContainer">
    <asp:HiddenField ID="hdMyControl" runat="server" /></div>
hdMyControl.Value = "something";
$(document).ready(function () {
    var myValue= $('#myContainer input[type=hidden]').val();