在由AJAX调用触发的方法中获取Page控件
本文关键字:获取 Page 控件 方法 AJAX 调用 在由 | 更新日期: 2023-09-27 18:06:02
我在一个单独的class文件中调用一个需要更新标签的方法。
[WebMethod] //needed for the AJAX call
public static void MyClick(int postid, int userid) //must be static
{
Page page = new Page();
//Page page = HttpContext.Current.Handler as Page //Pass the Page but don't work
MyClass.MyMethod(postid, userid, page);
}
方法MyClick()是从asp调用的。
将MyClass.cs文件(包含MasterPage)放到单独的MyClass.cs文件中。我无法获得控件(标签)与FindControl()。我猜是"Page"没有被正确传递。就我在调试中看到的,"page"有很多异常。
((Label)page.FindControl("ContentPlaceHolder1_lbl)).Text = "foo";
这是序列:
1)用户点击"喜欢"动态创建的LinkButton
2)有一个JS监听器,在点击改变为"不喜欢"(示例),并做一个AJAX POST到aspx页面方法MyClick()与参数(postid, userid)。
3) MyClick()调用MyClass.cs中的MyMethod(postid, userid)
4) MyMethod()做一些SQL(工作)和更新标签(AJAX调用不工作,因为MyMethod()试图将标签设置为"foo")。
您没有传递当前页面,您正在创建一个新页面:
Page page = new Page();
你可以传递当前页面的引用:
MyClass.MyMethod(postid, userid, this);
(虽然为了做到这一点,你的页面方法不应该是static
。事实上,为了在页面实例上引用任何,该方法不应该是static
。参见下面的编辑)
然而,一般来说,最好的做法是不要让其他组件依赖于您的页面元素。只有页面的代码才应该知道/关心它所拥有的UI元素。
不是让方法设置值,而是让方法计算并返回值,然后让页面设置它。像这样:
var result = MyClass.MyMethod(postid, userid);
myLabel.Text = result;
这样外部组件就不会与这个特定的页面紧密耦合,可以被其他页面重用,等等。
编辑:你想做的事情在你正在使用的框架中是行不通的。ajax调用的web方法是static
的原因。它们不维护页面状态。所以在web方法的上下文中,没有页面,没有标签。AJAX调用是一个简单的服务,它接受值并返回响应。
[WebMethod]
public static string MyClick(int postid, int userid)
{
return MyClass.MyMethod(postid, userid);
}
与本回答的前面部分一样,外部组件应该简单地计算并响应新值。它不应该与页面耦合。这个web方法应该使客户端代码接收到更新后的值。然后,无论您如何管理该客户端(问题中没有客户端代码),您都将使用结果值更新页面标记。