首页 > 解决方案 > 从内容页面访问母版页控件(html:输入)不起作用

问题描述

我在母版页上有一个输入控件,其中存储了运行 onload 的 javascript 返回的窗口大小。我需要从内容页面访问这些控件,但我无法使其工作。为了使事情更明显和更容易,我使用输入类型“文本”。一旦一切正常,我会将其切换为“隐藏”类型

<input type="text" runat="server" id="hiddenInputW" />

在内容页面上,我正在尝试访问 on page_load 事件中的控件。

HtmlInputText width = (HtmlInputText)Page.Master.FindControl("hiddenInputW");
HtmlInputText height = (HtmlInputText)Page.Master.FindControl("hiddenInputH");

另一个不起作用的选项是在 Masterpage 上创建此方法:

public string WindowWidth
{
    get
    {
        return Convert.ToString(hiddenInputW.Value);
    }
} 

并从内容页面端访问(在 page_load 中)

LabelTest.Text = Master.WindowWidth;

两次数据都没有传递到内容页面。

我通过 LinkBut​​ton 和代码访问内容页面:

Response.Redirect("ProcessMap.aspx");

我用来获取窗口大小的 Javascript 是:

<script src="jquery-1.9.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
$("#hiddenInputW").val($(window).width());
$("#hiddenInputH").val($(window).height());
});
</script>

标签: javascriptc#htmlasp.netmaster-pages

解决方案


好的,如上所述,请阅读我的评论。问题是页面首先在服务器上呈现,后面的代码运行(但你还不能得到那些隐藏的字段值)。

然后页面向下移动到浏览器,页面被渲染并显示在浏览器中,然后运行 ​​js 代码来设置/获取/抓取屏幕分辨率内容并将这些值保存到隐藏字段中。

您实际上描述了行为:可以在第一次回发的页面上获取值。那么我该如何解决这个问题

如前所述,任何按钮单击 - 您不仅限于第一次回发,但实际上任何和所有后续回发都将允许您获取值。是的,这包括使用链接按钮。因此,如果您乐于接受以某种形式的回发(包括链接按钮)来获取这些值,那很好。

如果您愿意,您可以在不回发的情况下获取这些值。您要做的是代替第一次运行客户端的 js 代码,即 js 代码可以运行并调用将值传递给服务器的 web 方法,然后您可以说将值保存在 session() 中。所以要么你在额外的回传中获取这些值(第一个,或者在第一页加载之后的每个人,或者你让那个 js 代码运行并对服务器上的一个 web 方法进行 AJAX 调用,然后可以说将这些值保存到会议()。

所以,你有以上两种选择:

Get the values in the hidden fields on any postback that occurs on that page.

Use a AJAX call which does not require a post-back, but such calls of course don't 
do a post-back, so you can't get/grab/see in code behind the controls on the FIRST
page load since they are still sitting on the users desktop.
However a AJAX call does allow you to pass values to the server, and thus as a
result you can/could have this information available from that point on, which
of course means on ANY new post-back, which of course is quite much the first 
example and use case anyway!

所以即使我们确实使用了 AJAX 调用和 Web 方法?然后现在你的代码可以看到/使用这些值,但你只能在一些用户交互上运行这样的代码,无论如何都会导致回发!

(除非您只是想将屏幕大小和客户端浏览器一次记录到数据库中 - 这当然表明 AJAX 调用会更好。这取决于您需要该信息的目的以及您将如何使用它? 如果你只是记录这些信息——那么是的,AJAX 调用会更好。

如果您的应用程序需要这些信息,那么使用 AJAX 调用几乎没有什么好处,因为您在该站点上运行的任何和所有代码都将是回发的结果,所以现在我们还是回到正题。

简单的问题是您无法在第一页加载时获得这些值。但是话又说回来,这可能并不重要,并且将来对此类值的任何使用都将是回发的结果。


推荐阅读