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

Mat*_*att 32 javascript asp.net ascx clientid

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

如果我使用代码

<%= someObject.ClientID %>
Run Code Online (Sandbox Code Playgroud)

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

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

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

Bey*_*ygi 33

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

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

var time = "<%= DateTime.Now.ToString() %>";
alert(time);
Run Code Online (Sandbox Code Playgroud)

然后在您的页面中引用它

<script src="Scripts/file.aspx" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)

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

如果唯一使您这样做的是client-id,那么您可以使用以下ASP.NET 4功能

<any-tag ID="myCustomId" runat="server" ClientIDMode="Static" />
Run Code Online (Sandbox Code Playgroud)

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

注意使用序列化方法,您可以更改任何标记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
                     });
    } 

    ...
}
Run Code Online (Sandbox Code Playgroud)

页面ASPX

<script type="text/javascript">
    var IDs = <%= GetTagIds() %>;
</script>
Run Code Online (Sandbox Code Playgroud)

随地

<script type="text/javascript">
    IDs.myCalendar.doSomthing...
</script>
Run Code Online (Sandbox Code Playgroud)

还有另一个选项,你可以将所有的javascript文件传递给ASP.NET处理程序,但我不推荐它,因为只有一个javascript文件,你使asp.net处理程序忙.

代码块

<%内联代码%>

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

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

<% while(i < 0) { %>
      <% 
         Response.Write(i.ToString()); 
         i++;
      %>
<%}%>
Run Code Online (Sandbox Code Playgroud)

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

<%=内联表达式%>

这个等于调用Response.Write你自己,见:

<%= "Hi" %> equals to <% Response.Write("Hi"); %>
Run Code Online (Sandbox Code Playgroud)

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

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

这一个等于:

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

并且出于安全原因使用--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 %>" />
Run Code Online (Sandbox Code Playgroud)

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

<%#data-binding expression%>

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

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

哪一个Eval或Bind?

使用Bind你有两个绑定设置在ASP.NET控件的指定属性上看到提到的下拉,它是使用Bind,这意味着如果最终用户选择一个值,然后提交页面,下拉列表将不会松动它选定的价值.

使用Eval仅显示数据.

<asp:FormView ...>
     <ItemTemplate>
          <a href='Eval("Link")'>Eval("LinkText")</a>
     </ItemTemplate>
</asp:FormView>
Run Code Online (Sandbox Code Playgroud)

<%@ text template directive%>

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

<%@ OutputCache...%>
This one is OutputCache Directive and so on...
Run Code Online (Sandbox Code Playgroud)


Dan*_*abo 20

这完全有可能.

在您的表示层(您的.aspx页面)中,创建一个包含您的javascript代码的aspx页面的脚本引用:

<script src="../MyJavaScriptFile.js.aspx" type='text/javascript'></script>
Run Code Online (Sandbox Code Playgroud)

然后,在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);%>'
Run Code Online (Sandbox Code Playgroud)

我经常使用的一种技术是将我需要在我的javascript文件中评估的值作为初始脚本引用中的url参数传递:

 <script src="../MyJavaScriptFile.js.aspx?username=<% somevalue %>" 
       type='text/javascript'></script>
Run Code Online (Sandbox Code Playgroud)

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

<% Request.QueryString["username"] %>
Run Code Online (Sandbox Code Playgroud)

这不是做事的"最佳实践"方式,但它可以通过我的穴居人大脑可以理解的方式完成工作,而无需采用花哨的解决方法和额外的代码.

  • 不要在javascript文件中使用`<%Request.QueryString [...]%>`,它容易受到XSS的攻击,这意味着如果所有用户之间以某种方式共享该值,那么恶意用户甚至可以劫持所有用户会话. . (2认同)