其他地方也提出了类似的问题,但答案似乎并不适用于我的特殊情况。
我在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中作为名为“result”的局部变量访问,该变量将传递给“success”或“failure”函数。
<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;
}
答案 0 :(得分:2)
您无法从ASP.NET中的PageMethod访问实例字段,我怀疑这是您在此处尝试实现的目标。就是这样,你可以做的并不多。所以我建议你只需让你的页面方法将隐藏字段的值作为参数:
public static void Data2(string value)
{
... do something with the value of the hidden field
}
现在让页面方法的调用者提供所需的值,因为它位于页面的上下文中。
答案 1 :(得分:1)
目前还不清楚这里发生了什么 - 你正在努力实现的目标。您收到错误的原因可能是_Default
的无参数构造函数未将dataReceiver
设置为有用值。
Data2()
需要是否有任何理由成为静态方法? 逻辑应该打电话给Data1()
?你不应该只是决定这一点,因为你需要在某些实例上调用Data1()
,只需创建_Default
的新实例即可把它称之为。计算出调用的逻辑目的,这应该指出你需要调用Data1()
的实例 - 或者这实际上是否应该是一个实例方法。
答案 2 :(得分:0)
为什么要创建新实例:_Default def = new _Default();
,要使用dataReceiver.Value
来访问它。如果控件指定runat=server
,则表示您可以从后面的代码中访问该控件。
为什么Data1
是实例方法?我们需要更多信息。