有没有办法在外部 javascript 文件中使用“<%= someObject.ClientID %>”?
如果我使用代码
<%= someObject.ClientID %>
在我的 as(c/p)x 页面内的脚本标签中,它工作正常。在呈现的页面上,ClientID 被解析。但是,如果我放入一个外部 JS 文件并添加:
它没有。有没有办法做到这一点,还是我坚持将代码留在 as(c/p)x 文件中?
附带问题 - 在您的标记文件中执行 <%=... %> 的行为是什么?
有没有办法在外部 javascript 文件中使用“<%= someObject.ClientID %>”?
如果我使用代码
<%= someObject.ClientID %>
在我的 as(c/p)x 页面内的脚本标签中,它工作正常。在呈现的页面上,ClientID 被解析。但是,如果我放入一个外部 JS 文件并添加:
它没有。有没有办法做到这一点,还是我坚持将代码留在 as(c/p)x 文件中?
附带问题 - 在您的标记文件中执行 <%=... %> 的行为是什么?
如果您真的想这样做,您可以执行以下操作
<%@ 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>
注意使用上述方法时,传递目标页面控件客户端 ID 的唯一方法是将客户端 ID 作为字符串存储在公共属性中,然后使用该页面的新实例引用它
如果唯一让您这样做的是客户端 ID,那么您可以使用以下 ASP.NET 4 功能
<any-tag ID="myCustomId" runat="server" ClientIDMode="Static" />
您还可以将所有客户端 ID 放在 C# 类中,然后使用 JSON 对其进行序列化并在脚本标记中呈现它,这可能是 ASP.NET 版本 4 之前的智能方式。
请注意,使用序列化方法,您可以更改任何标记 ID,而不必担心 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# 语言的内联代码时,在每个语句的末尾,您可以使用页面指令语言属性更改内联语言
这相当于调用 Response.Write 你自己,见:
<%= "Hi" %> equals to <% Response.Write("Hi"); %>
注意 你不应该包括';' 使用内联表达式时
这等于:
Response.Write(HttpUtility.HtmlEncode("<script type="text/javascript">alert('XSS');</script>"))
并且出于安全原因使用--XSS,任何输入 HTML 都会输出 HTML 编码文本,可以安全地在页面中显示用户输入的内容。
注意 你不应该包括';' 使用编码内联表达式时
这是一个表达式,您可以使用它来绑定来自 ConnectionStrings、Resources 和 AppSettings 的值
表达式前缀的可能性是
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" />
使用 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...
这是完全可能的。
在您的 .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); %>;
.
也很有帮助 - 此技术支持查询字符串参数:
<script src="../MyJavaScriptFile.js.aspx?username=<% somevalue %>"
type='text/javascript'></script>
然后,在 MyJavaScriptFile.js.aspx 中,我可以使用
var username = '<% Request.QueryString["username"] %>';
这不是做事的“最佳实践”方式,但它以我的穴居人大脑可以理解的方式完成工作,而无需求助于花哨的解决方法。
我喜欢在我的页面上嵌入一行 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();
我不确定这是否重要,但我通过代码隐藏将脚本引用添加到页面RegisterClientScriptBlock
您可以在外部文件中创建一个空的回调函数:
var MyCallback = function () { };
然后在 asp/cx 中执行以下操作:
MyCallback = function () {return "<%= someObject.ClientID %>";}
然后,回到您的外部文件:
var myClientID = MyCallback();
不,它不会那样工作,因为 javascript 文件是作为一个单独的文件独立传输的,并且在输出时它没有被 ASP.NET 解析,而你的 aspx 文件正在被解析并且 .NET 引擎正在替换带有实际值的标签。
现在,当您的对象调用这些 JS 函数时,它们可以做的就是将对自己的引用传递给函数,或者甚至使用您自己的键传递某种字典列表,以了解控件是什么和分配的名称。
还要考虑一件事-如果您要制作一个独立于 ASPX 页面的 JS 文件,那么该 JS 文件绝对不应该假定知道有关调用它的 aspx 文件的特定控件的任何内容-因为稍后有人否则可能会决定,“哦,这是一个很好的 JS 文件,我也会合并它”,这对他们不起作用,因为他们的对象与你的不匹配。因此,您应该遵循的模式必须更加通用——这就是为什么您要传入引用或标识符列表的原因。
服务器标签<%= %>
用于输入在服务器上处理的代码。
您不能<%= someObject.ClientID %>
在外部 js 文件中使用,因为服务器标签是 asp.net 的东西,而 js 不知道这是什么。
如果您使用 ASP.NET 4,您可以在控件的属性中设置客户端 ID,使其可预测。
如果您不使用 ASP.NET 4,您可以将此客户端 ID 放在隐藏字段或内联 js 变量中。
在脚本源文件中使用标准前缀标识符:
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;