从WebMethod调用Master页面上的方法

时间:2010-08-04 19:12:52

标签: c# asp.net ajax master-pages

或任何可行的解决方法。

因此,想象一个使用方法IFooMaster

实现ShowFancyMessagePopupTheBusinessCantLiveWithout(string message);的母版页

我在一个继承此母版页的页面中。在取消选中复选框后,我想向用户显示一条消息,如果他们保存了该消息,则他们无法在没有管理员操作的情况下重新选中该复选框。

我收到的反馈是,我不能在javascript中使用alert('message');,因为他们希望这些消息具有一致的外观。

接下来,我尝试通过PageMethods进行ajax调用(就像这个代码库中的其他所有内容一样)来显示消息。我的问题在于这种方法是静态的。

[WebMethod]
public static void ShowSuperImportantMessage()
{
     if(!checkboxICareAbout.Checked)
         ((IFooMaster)Master).ShowFancyMessagePopupTheBusinessCantLiveWithout("If you uncheck that thing, you can't recheck it.");
}

由于ShowSuperImportantMessage()static,我无法从内部访问Master

母版页上的方法或多或少看起来像这样:

public void ShowFancyMessagePopupTheBusinessCantLiveWithout(string message)
{
    lblGenericMessage.Text = message;
    btnGenericMessageOK.Focus();
    upGenericMessage.Update();
    mpeGenericMessage.Show();
}

mpeGenericMessage是一个ajaxtoolkit:ModalPopupExtender。

upGenericMessage是一个更新小组。

另外两个是显而易见的。

有什么想法吗?我可以做一些jQuery kung-fu来展示那些东西吗?我试过了,但解决方案抱怨我试图通过ClientID引用的控件没有解决,因为它们在Master页面上。

快速修改:在有人告诉我架构是个问题之前,或者我不应该把这样的东西放在母版页上,或者没有...

我知道情况并不理想,但我这是继承的代码,我不能放弃所有内容并重写一半的Web堆栈。

3 个答案:

答案 0 :(得分:1)

尝试这样的事情(未经测试):

((IFooMaster) ((Page)HttpContext.Current.Handler).Master)

看起来这不起作用 - 调用PageMethod时没有连接Master(有意义)。

因此,请使用相同的母版页创建一个空白页面。让该页面接受POST或GET,无论您需要传递给母版页方法的参数是什么。让Page_Load提取参数并调用方法。然后应该使用Response.Write返回结果(并记住更改Content-Type)。让客户端代码调用页面并获得结果。

答案 1 :(得分:0)

您是否在ClientID之前尝试了类似window.top的内容?

每条评论 您不需要对ClientID进行硬编码。由于您的js在页面中,请尝试以下几行....

window.top.document.getElementById( "<%= yourelement.ClientID %>" ).Whatever();

答案 2 :(得分:0)

很抱歉花了这么长时间回复/回答。

我不为此感到骄傲,请注意,但最终的解决方案是将客户端ID硬编码到jQuery中,该jQuery拉出母版页上的模式对话框。

像我说的那样,我并不为这种肮脏,肮脏的修复感到骄傲。然而,令人安慰的是,因为它位于母版页上,所以它上面没有任何命名容器。因此,遇到clientID更改问题的可能性要小得多。