从内容页面访问母版页控件(html:输入)不起作用

Posted

技术标签:

【中文标题】从内容页面访问母版页控件(html:输入)不起作用【英文标题】:Access Master Page control (html: Input) from Content Page doesn't work 【发布时间】:2021-08-02 01:22:25 【问题描述】:

我在母版页上有一个输入控件,我在其中存储由运行 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>

【问题讨论】:

【参考方案1】:

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

然后页面向下移动到浏览器,页面被渲染并显示在浏览器中,然后运行 ​​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 调用几乎没有什么好处,因为您在该站点上运行的任何和所有代码都将是回发的结果,所以现在我们还是回到正题。

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

【讨论】:

谢谢Albert,我终于投降了,将使用固定的窗口大小。我可以使它适用于您首先使用其默认内容页面加载母版页的场景,其中不需要特定大小的渲染。在该步骤中,尺寸被抓取,并且可以在我进入内容页面时用于下一次回发。但是我无法从一开始就访问这些内容页面,并且无法按照您的预测在第一次渲染时获得大小。无论如何,感谢您解释这些观点

以上是关于从内容页面访问母版页控件(html:输入)不起作用的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET内容页中访问母版页中的对象

关于asp.net中页面事件加载的先后顺序

asp.net 如何从具有嵌套母版页的内容页更改父母版页中的控件

如何从母版页上的用户控件访问母版页中定义的数据集?

如何在母版页中调用jquery ui autocomplete以在内容页面中定义控件

从内容页面设置母版页上的属性值