在由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")。

在由AJAX调用触发的方法中获取Page控件

您没有传递当前页面,您正在创建一个新页面:

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调用是一个简单的服务,它接受值并返回响应。

所以即使你可以在服务器端更新标签,那也不会在客户端做任何事情。您的客户端代码需要更新浏览器中的标记。要做到这一点,AJAX调用应该简单地响应新值,JavaScript代码应该使用返回的值来更新页面。像这样:
[WebMethod]
public static string MyClick(int postid, int userid)
{
    return MyClass.MyMethod(postid, userid);
}

与本回答的前面部分一样,外部组件应该简单地计算并响应新值。它不应该与页面耦合。这个web方法应该使客户端代码接收到更新后的值。然后,无论您如何管理该客户端(问题中没有客户端代码),您都将使用结果值更新页面标记。