从内容页面访问母版页控件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>

解决方法

好的,如上所述,请阅读我的评论。问题是页面首先在服务器上呈现,后面的代码会运行(但您还无法获取那些隐藏字段值)。

然后页面向下移动到浏览器,页面在浏览器中呈现和显示,然后才运行 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 调用的优势就没有什么帮助了,因为您在该站点上运行的任何和所有代码无论如何都将是回发的结果,所以现在我们还是回到原点。

简单的问题是您无法在第一页加载时获得这些值。但话又说回来,这很可能无关紧要,而且这些值的任何未来使用都将是回发的结果。