ASP.NETアプリケーションの背後にあるクライアント側のJavaScriptコードとC#コードの間でデータを渡す最も効率的で標準的な方法を探しています。私はこれを達成するために以下の方法を使用してきましたが、それらはすべて少しファッジを感じています。
JavaScriptからC#コードにデータを渡すには、hidden ASP変数を設定し、ポストバックをトリガーします。
<asp:HiddenField ID="RandomList" runat="server" />
function SetDataField(data) {
document.getElementById('<%=RandomList.ClientID%>').value = data;
}
次に、C#コードでリストを収集します。
protected void GetData(object sender, EventArgs e)
{
var _list = RandomList.value;
}
逆に言うと、ScriptManagerを使用して関数を登録し、Page_Load中にデータを渡します。
ScriptManager.RegisterStartupScript(this.GetType(), "Set","get("Test();",true);
または、ポストバックの前、または初期化またはプリレンダリングの段階で、コントロールに属性を追加します。
Btn.Attributes.Add("onclick", "DisplayMessage("Hello");");
これらの方法は私によく役立ち、仕事をしましたが、それらは完全ではないと感じています。クライアント側のJavaScriptとC#のバックエンドコードの間でデータを渡すより標準的な方法はありますか?
HtmlElementクラスを説明する this one のような投稿をいくつか見ました。これは私が調べなければならないものですか?
この例 のように、JavaScriptから静的ページメソッドを簡単かつ簡単に呼び出すことができます。複数のページからメソッドを呼び出す必要がある場合は、Webサービスをセットアップして、同じ方法でJavaScriptから呼び出すことができます。例も以下に含まれています。
.aspxコード
<asp:ScriptManager ID="ScriptManager1"
EnablePageMethods="true"
EnablePartialRendering="true" runat="server" />
コードビハインドコード
using System.Web.Services;
[WebMethod]
public static string MyMethod(string name)
{
return "Hello " + name;
}
JavaScriptコード
function test() {
alert(PageMethods.MyMethod("Paul Hayman"));
}
注:ページメソッドは静的である必要があります。これは、アプリケーションが何をしようとしているかに応じて、問題になる可能性があります。ただし、情報がまったくセッションに基づいており、何らかの組み込み認証を使用している場合は、WebMethodデコレーターにEnableSession属性を配置すると、HttpContext.Current.Userで取得できるようになります。セッション等.
JQueryをご覧になることをお勧めします。 JQueryを使用してAJAXをサーバーに呼び出すことができます。これにより、必要な任意の形式でデータを返すことができます。JavaScriptで直接使用できるため、JSONが適切な形式です。
jQuery を使用してサーバーからjavascriptにデータをプルするには、次のフェッチで http://youserver.com/my/uri への非同期リクエストを作成し、提供された関数内のサーバー。
$.get("my/uri",
function(data) {
// client side logic using the data from the server
})
JavaScriptからサーバーへのデータ送信も同様に機能します。
$.post("my/uri", { aValue : "put any data for the server here" }
function(data) {
// client side logic using the data returned from the server
})
JSONは、タスクを実行するための最良の方法です。問題を「C#とJavaScript」の間の受け渡しと見なさないでください。この考え方は、元の投稿にあるような奇妙なコードにつながります。
より一般的には、言語にとらわれない方法でクライアントとサーバーの間でオブジェクトを渡すだけです。 JSONは広くサポートされており、読みやすいため、タスクに最適です。
MicrosoftはUpdatePanel
コントロールを実装してajaxを実行しているため、これは間違いなく「標準」の方法です。個人的にはお勧めしませんが、JavaScriptを直接使用する場合の豊富な機能セットとコントロールに近いものはありません。
これは私が個人的に行う方法です:
標準ページのポストバックで使用するクライアント側の値の非表示フィールドを作成します(つまり、ユーザーが送信を押したとき)
<asp:HiddenField ID="selectedProduct" runat="server" />
コードビハインドで、クライアント側で使用するコントロールを登録します。
/* Register the controls we want to use client side */
string js = "var productBox = document.getElementById('" + selectedProduct.ClientID + "'); ";
js += "var macCodeBoxBE = document.getElementById('" + beMacCode.ClientID + "'); ";
ClientScript.RegisterStartupScript(this.GetType(), "prodBox", js, true);
JavaScriptライブラリ*を使用してajaxの投稿/取得を行い、JavaScriptを使用して応答に基づいてページを更新します
$.get("../ajax/BTBookAppointment.aspx?dsl=" + telNumberBox.value + "&date=" + requiredDate.value + "×lot=" + ddTimeslot.value, function (response, status, xhr) {
if (response.indexOf("not available") > -1) {
loaderImage.src = "../images/cross.png"
output.innerHTML = response;
} });
renderメソッドをオーバーライドして作業を行う別の「ajax」ページを作成します。
protected override void Render(HtmlTextWriter writer)
{
if (string.IsNullOrEmpty(Request["mac"])) { return; }
if (string.IsNullOrEmpty(Request["dsl"])) { return; }
DataLayer.Checkers.BTmacCheckResponse rsp = DataLayer.Checkers.Foo.CheckMAC(Request["dsl"], Request["mac"]);
writer.Write(rsp.Valid.ToString());
}
*豊富なライブラリから選択できます。自分で作成することもできます。私は jQuery をお勧めします。安定しており、広範な機能セットを備えています。
サーバーサイドASPを必要としない入力タグを設定するには、以下を使用できます(またはフォームのデータバインディングの場合は<%#%>)。
html:
<input type="hidden" value='<%= RandomValues %>' name="RANDOM_VALUES" />
aSPコントロール:
<asp:HiddenField ID="RandomList" runat="server" />
ポストバックの値を取得する
Request.Form["RANDOM_VALUES"]
その場合、ASPコントロールの非表示の入力は、使用できます
Request.Form[RandomList.UniqueID]
Request.Formの優れた点は、同じ「name」属性を持つ複数のタグがある場合、CSVで結果が返されることです。