他の場所でも同様の質問がありましたが、私の特定の状況では答えがうまくいかないようです。
aspx ページに隠しフィールドがあります。
<asp:HiddenField ID="dataReceiver" runat="server" Value="" />
コードビハインドからこのフィールドにアクセスしようとしています。VS2010が自動生成するデフォルトクラス内から参照する必要があるようです。新しいクラスを作成できないので、次のことを試しました。
1public partial class _Default : System.Web.UI.Page
2{
3 protected void Page_Load(object sender, EventArgs e)
4 {
5 Data2();
6 MessageBox.Show(dataReceiver.Value);
7 }
8 public void Data1()
9 {
10 dataReceiver.Value = "123456";
11 }
12 public static void Data2()
13 {
14 _Default def = new _Default();
15 def.Data1();
16 }
17}
これにより、10 行目で「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが生成されます。
また、14行目を「_Default def = new _Default().Data1();」と入力してみました。しかし、これはコンパイラによってエラーで拒否されます:「タイプ 'void' を 'WebApplication6._Default' に暗黙的に変換できません」
これを機能させる方法はありますか、それともまったく別のアプローチが必要ですか?
[編集] 以下の Darin の回答でこれは解決しましたが、情報を適用する方法を理解するのに少し時間がかかりました。後で誰かが同様の問題でこれを読んだ場合に備えて、解決策の詳細を明確にする必要があると思いました。
WebMethod はインスタンス メソッドを呼び出すことができず、「runat」属性に関係なくページの要素にアクセスできないように見えますが、呼び出し元の JavaScript メソッドに値を返すことができます。値は、「成功」または「失敗」関数に渡される「結果」と呼ばれるローカル変数として JavaScript でアクセスできます。
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<asp:ScriptManager id="scriptManager1" runat="server" EnablePageMethods= "true" />
<asp:HiddenField ID="dataReceiver" runat="server" Value="789" />
</asp:Content>
//Javascript
function callServer() {
PageMethods.Data2($("#MainContent_dataReceiver").attr("value").toString(), success, failure);
function success(result, userContext, methodName) { alert(result + " . " + userContext + " . " + methodName); }
function failure(result, userContext, methodName) { alert(result + " . " + userContext + " . " + methodName); }
}
//C# Code Behind
[WebMethod]
public static string Data2(string value)
{
value = "101112";
return value;
}