或任何可行的解决方法。
因此,想象一个使用方法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堆栈。
答案 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更改问题的可能性要小得多。