在由AJAX调用

时间:2015-08-03 14:36:40

标签: c# findcontrol

我在需要更新标签的单独类文件中调用方法。

    [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.aspx文件(使用MasterPage)调用到单独的MyClass.cs文件。

我无法使用FindControl()获取Control(Label)。我的猜测是" Page"未正确传递。对于我在调试中看到的内容," page"有很多例外。

((Label)page.FindControl("ContentPlaceHolder1_lbl)).Text = "foo";  

这是序列:
1)用户点击排序"喜欢"动态创建的LinkBut​​ton
2)有一个JS监听器,点击更改为" Dislike" (示例)并使用参数(postid,userid)对aspx页面方法MyClick()进行AJAX POST。
3)MyClick()调用MyClass.cs中的MyMethod(postid,userid) 4)MyMethod()执行一些SQL(正在工作)并更新标签(由于MyMethod()尝试将标签设置为" foo"),因此AJAX调用无效。

1 个答案:

答案 0 :(得分:2)

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

Page page = new Page();

可以只传递对当前页面的引用:

MyClass.MyMethod(postid, userid, this);

(虽然为了做到这一点,你的页面方法不应该是static。实际上,为了在页面实例上引用任何,该方法不应该是{{} 1}}。请参阅下面的编辑

然而,一般来说,最好不要让其他组件依赖于您的页面元素。只有页面的代码应该知道/关心它拥有的UI元素。

不是让方法设置值,而是让方法计算返回该值,然后让页面设置它。像这样:

static

这样,外部组件不会紧密耦合到此特定页面,可以被其他页面重复使用等。

编辑:您正在尝试进行的物理操作无法在您正在使用的框架中运行。 AJAX调用的Web方法是static for a reason。它们不维护页面状态。因此,在该Web方法的上下文中,没有页面,没有标签。 AJAX调用是一个简单的服务,它接受值并返回响应。

因此,即使您可以更新标签服务器端,也不会在客户端执行任何操作。您的客户端代码需要更新浏览器中的标记。为此,AJAX调用应该只响应新值,JavaScript代码应该使用返回的值来更新页面。像这样:

var result = MyClass.MyMethod(postid, userid);
myLabel.Text = result;

正如本答案前面部分所述,外部组件应该只计算并响应新值。 不应该耦合到页面。此Web方法应导致客户端代码接收更新的值。然后,无论您管理该客户端(问题中没有客户端代码),您都会使用该结果值更新页面标记。