0

首先,是的,我知道我不应该使用框架,但我别无选择。这是一个让我头疼的旧系统,但网络工程师喜欢它,并要求这是他们的信息和页面必须去的地方。

我目前正在使用 .NET 4.0 框架 c#,尽管我怀疑它对这个问题很重要,但 SQL Server 2008R2。

目前存在的问题:我需要一种方法来确定是否选择了主硬件或备用硬件,以便我可以根据加载的页面将页面加载的单选按钮和初始信息正确设置为主硬件或辅助硬件. 我的页面正在使用的网站是第三方网站,我无权对其进行修改,因此我不能将 URL 变量添加到该页面或更改设置。

URL 有变量,但它们是在网站的其他地方静态生成的,并且仅在我的页面所在的框架内可见。我从来没有真正使用过框架,所以我有点不知所措。更糟糕的是,由于设置和测试的方式,我实际上不确定如何在代码中设置任何断点以查看它失败的地方。

我想不出另一种解决方法,但我很乐意有一个涉及这种框架式废话的解决方案。

到目前为止,我一直在寻找这些指导,但没有取得太大的成功。 在 url 和框架之间共享变量msdn 的 .NET 4.0 页面上的 Frames,关于如何从框架中获取 url 变量的帖子,以及从代码隐藏动态加载 IFrame 中的页面

目前,我被要求确保页面不会中断,这就是为什么要检查而不是刚刚完成的原因。它目前在该站点的两个地方,一个没有框架和 URL 变量(管理员想要删除),另一个有 URL 变量和框架。现在,第一个不能中断,这就是为什么你会看到一些奇怪的检查和 ?? 操作员。

        protected void Page_Load(object sender, EventArgs e)
        {

            if (!IsPostBack)
            {
                System.Web.UI.HtmlControls.HtmlGenericControl orionIFrame =
                        (System.Web.UI.HtmlControls.HtmlGenericControl)this.FindControl("pcmaframe");
                if (orionIFrame != null)
                {
                    string frameURL = orionIFrame.Attributes["src"].ToString() ?? "";

                    Uri frameURI = new Uri(frameURL);

                    NameValueCollection queryVars = HttpUtility.ParseQueryString(frameURI.Query);

                    //If this is in Orion, we want to change the canceller to standby if it's 97, not 96
                    if (queryVars["NetObject"] == "N:97" || queryVars["NetObject"] == "N%3a97")
                    {
                        SelectCanceller.SelectedValue = "Standby";
                        primaryStandby = false;
                    }
                }
//Do some other stuff to generate page data

现在,生成框架的代码如下所示(其中 [url] 替换了实际的 url,[mypage] 替换了我使用的实际文件名):

NodeID - ${NodeID}<br>
Node Name - ${NodeName}

<iframe id="pcmaframe" src="[url]/[mypage].aspx?NetObject=N:" + ${NodeID} width = 1000 height = 1500>
</iframe>

目前,没有不良行为,只是无法切换。无论 URL 变量如何,两个页面都显示主页面。主要是 N:96,次要是 N:97。我检查的原因是我希望它在失败的情况下显示一些东西,所以它默认为主要硬件。

所以,很棒的 Stack Overflow 人......你能回答我的三个问题中的任何一个吗?

  1. 当我无法插入断点时,如何在不向页面添加输出的情况下对单独网站上的框架进行故障排除?

  2. 除了使用 URL 变量和弄乱这些框架,我还能做什么?

  3. 我在代码中遗漏或搞砸了什么逻辑导致框架/不/识别 URL 变量?

更新

好吧,到目前为止,我已经确定框架为空。不确定这是否是因为 this.FindControl 没有正确转换,或者是由于网站使用框架的方式,或任何其他事情......

4

1 回答 1

0

在被允许向页面添加一些调试输出后,我能够找到解决方法。根据一些测试和这些文章,我相信正在发生的事情:

FindControl() 返回空值

在 ASP.NET 中查找控件的更好方法

http://msdn.microsoft.com/en-us/library/txxbk90b%28v=vs.90%29.aspx

http://forums.asp.net/t/1097333.aspx

http://msdn.microsoft.com/en-us/library/system.web.ui.page.previouspage.aspx

是不是我的程序/页面正在使用的网站的框架比我的 ASP 在没有大量技术巫术的情况下可以访问的级别更高。由于框架没有返回,我开始测试,发现调用框架实际上是使用 [URL].[MyPage].aspx?NetObject=N:97 作为上一页或调用页面。在各种情况下都是如此,这意味着使用 Request.UrlReferrer 是半安全的:

protected void Page_Load(object sender, EventArgs e)
{

    if (!IsPostBack)
    {
        string frameURL = Request.UrlReferrer.ToString() ?? "NO DATA";

        if ((frameURL != null) && (frameURL != "NO DATA"))
        {

            Uri frameURI = new Uri(frameURL);

            NameValueCollection queryVars = HttpUtility.ParseQueryString(frameURI.Query);

            //If this is in Orion, we want to change the canceller to standby if it's 97, not 96
            if (queryVars["NetObject"] == "N:97" || queryVars["NetObject"] == "N%3a97")
            {
                SelectCanceller.SelectedValue = "Standby";
                primaryStandby = false;
            }
        }   
于 2013-06-25T15:25:13.183 回答