外部JavaScriptファイルで「<%= someObject.ClientID%>」を使用する方法はありますか?
コードを使用する場合
<%= someObject.ClientID %>
as(c/p)xページ内のスクリプトタグでは、正常に動作します。レンダリングされたページで、ClientIDが解決されます。ただし、外部JSファイルを入力して追加するだけの場合:
そうではありません。これを行う方法はありますか、またはそのコードをas(c/p)xファイルに残しておく必要がありますか?
サイド質問-マークアップファイルで<%= ...%>を実行する行為は何と呼ばれますか?
これは完全に可能です。
プレゼンテーションレイヤー(.aspxページ)で、javascriptコードを含むaspxページへのスクリプト参照を作成します。
<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);%>'
私がよく使用するテクニックの1つは、最初のスクリプト参照で、javascriptファイルで評価する必要がある値をurlパラメーターとして渡すことです。
<script src="../MyJavaScriptFile.js.aspx?username=<% somevalue %>"
type='text/javascript'></script>
次に、MyJavaScriptFile.js.aspxで、次の値を参照できます。
<% Request.QueryString["username"] %>
それは物事を行うための「ベストプラクティス」の方法ではありませんが、私の穴居人の脳が派手な回避策や余分なコードに頼ることなく理解できる方法で仕事を完了させます。
これを本当にやりたい場合は、次のことができます
<%@ 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である場合、次のASP.NET 4機能を使用できます。
<any-tag ID="myCustomId" runat="server" ClientIDMode="Static" />
また、すべてのクライアント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
});
}
...
}
ページASPX
<script type="text/javascript">
var IDs = <%= GetTagIds() %>;
</script>
どこでも
<script type="text/javascript">
IDs.myCalendar.doSomthing...
</script>
すべてのjavascriptファイルをASP.NETハンドラーに渡すことができる別のオプションがありますが、asp.netハンドラーをビジーにする単一のjavascriptファイルがあるため、お勧めしません。
これは、コードを実行できるインラインコード定義です。
<% 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から値をバインドするために使用できる式です
expressionPrefixの可能性は
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" />
バインドを使用すると、ASP.NETコントロールの指定された属性に設定された双方向バインディングがあり、前述のドロップダウンを参照してください。エンドユーザーが値を選択してからページを送信すると、ドロップダウンはそのバインドを失いません選択した値。
データを表示するためだけに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...
これによりもう少し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
を使用してコードビハインド経由でページにスクリプト参照を追加しています。
私は自分のページに1行のjavascriptを埋め込むのが好きです。
<script type="text/javascript">
Application.init({variable1: "value1", variable2: "value2"...});
</script>
大量のJavaScriptをページにレンダリングするのは良くありませんが、サーバーからJavaScriptに初期化値を渡す必要があるのが一般的です。これにより、不要なコードを大量に使用することなく、コールバック関数でグローバルネームスペースを汚染することなく実行できます。通常、Application
をプロジェクト固有のグローバルラッパーに置き換えます。
外部ファイルに空のコールバック関数を作成できます。
var MyCallback = function () { };
そして、asp/cxで次のようなことを行います。
MyCallback = function () {return "<%= someObject.ClientID %>";}
次に、外部ファイルに戻ります。
var myClientID = MyCallback();
いいえ、javascriptファイルは個別のファイルとして独立して送信されており、ASP.NETによって途中で解析されないため、aspxファイルIS解析されており、.NETエンジンはタグを実際の値と置き換えています。
オブジェクトがこれらのJS関数を呼び出すと、オブジェクトへの参照を関数に渡すか、コントロールが何であるかと割り当てられた名前の独自のキーを使用して何らかの辞書リストを渡すことさえできます。
同様に考慮すべきこと-ASPXページとは無関係にJSファイルを作成する場合、そのJSファイルabsolutelyは、後で誰かが「ああ、それは良いJSファイルだ、私もそれを組み込む」と決めるかもしれないので、それは彼らのために働かないでしょう。したがって、従うべきパターンは、より一般的なものでなければなりません。したがって、参照または識別子のリストを渡す必要がある理由です。
サーバータグ<%= %>
は、サーバーで処理されるコードを入力するために使用されます。
サーバータグはasp.netのものであり、jsはこれが何であるかを知らないため、外部のjsファイルでは<%= someObject.ClientID %>
を使用できません。
ASP.NET 4を使用する場合は、コントロールのプロパティでクライアントIDを設定して、予測可能にすることができます。
ASP.NET 4を使用しない場合、このクライアントIDを非表示フィールドまたはインラインjs変数に配置できます。