【发布时间】:2011-11-18 20:41:07
【问题描述】:
在其他地方提出了类似的问题,但答案似乎不适用于我的特定情况。
我在 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'”
有没有办法让这个工作,或者我需要一个完全不同的方法?
[编辑]
下面达林的回答为我解决了这个问题,但我确实花了一些时间来弄清楚如何应用这些信息。我想我应该澄清解决方案的细节,以防以后有人遇到类似问题。
尽管 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;
}
【问题讨论】:
-
您拥有此控件的
.aspx页面上的@Page指令是什么样的? -
为什么不直接从Page_Load方法调用Data1呢?
-
@ThomasLevesque - 因为您需要一个类的实例来调用 Data1。
-
@JonH,在 Page_Load 方法中,您已经在 _Default... 的实例中...
-
@ThomasLevesque 确实,我不知道 OP 的意图是什么,就像困惑一样。
标签: c# asp.net code-behind static-methods object-reference