• ASP.NET 2.0 读书笔记 圣殿 之 跨网页公布


    在ASP.NET 2.0使用以下四种方式:
    HyperLink
    Response.Redirect()
    Server.Transfer()
    Cross-Page Posting

    以下只说第四种,即“跨网页公布”
    区别于PostBack(只是自己ReCall自己),不再需要URL中的参数QueryString

    方法1:使用PreviousPage.FindControl访问来源网页A的空间属性属性。
    A页面有TextBoxA,在A页面的Button上设制PostBackUrl属性,为B页面。
    在B加载页面时:
        protected void Page_Load(object sender, EventArgs e)
        
    {
            TextBox txtB 
    = (TextBox)PreviousPage.FindControl("TextBoxA");
            Response.WriteLine(txtB.Text);
        }
    注意:这项技术只支持Button,LinkButton和ImageButton。

    方法2:使用@PreviousPageType访问来源网页A中的Public属性:
    还是A页面,A页面有TextBoxA,在A页面的Button上设制PostBackUrl属性,为B页面。后台代码公布属性:
    public partial class Default3 : System.Web.UI.Page
    {
        
    private string a;

        
    public string A
        
    {
            
    get return a; }
            
    set { a = value; }
        }

    }
    在B页面,设置如下,从而指定来源网页:
    <%@ PreviousPageType VirtualPath="~/A.aspx" %>
    在B加载页面时:
        protected void Page_Load(object sender, EventArgs e)
        
    {
            Response.Write(PreviousPage.A);
        }

    注意:一个页面只能由一个@PreviousPageType标签。即源与目标是一一对应的。


    方法3:使用@Reference,通过强类型来访问来源网页A中的Public成员。
    @Reference是通过将PreviousPage转换成与目标网页相同的类型,即强类型,这就不只可以访问属性了,还可以访问字段,方法等等,只要是public的。
    在目标B页面中添加
    <%@ Reference VirtualPath="~/A.aspx" %>
    那么在B中,就可以访问A这个页面类——基于文件系统的WebSite,其下的类是没有命名空间的,所以不能相互访问。
    假设源页面A是这样的:

    public partial class Default5 : System.Web.UI.Page
    {
        
    public string W;
        
        
    private string a = "a";

        
    public string A
        
    {
            
    get return a; }
            
    set { a = value; }
        }


        
    public string GetA()
        
    {
            
    return a;
        }

    }

    那么,在B加载页面时,

        protected void Page_Load(object sender, EventArgs e)
        
    {
            Default5 d5 
    = (Default5)PreviousPage;
            Response.Write(d5.A);

            Response.Write(d5.GetA());
        }

    说到这里,我自己试了一下,其实@PreviousPageType也可看作是强类型的,使用同方法三,只是相应在目标页面添加@PreviousPageType标签。。同时,我发现,只有添加了@PreviousPageType或@Reference后,目标页面类才能动态发现源目标类。

    再者,@PreviousPageType和@Reference的真正区别在于,一个页面只能由一个@PreviousPageType标签;但是一个页面却可以同时有多个@Reference,但这时候就需要额外的判断来源以决定相应的处理方法了,见下:
    假设目标页面B添加两个@Reference:

    <%@ Reference VirtualPath="~/Default5.aspx" %>
    <%@ Reference VirtualPath="~/Default3.aspx" %>

    B相应的加载过程:

       protected void Page_Load(object sender, EventArgs e)
        
    {
            
    try
            
    {
                
    if (PreviousPage != null)
                
    {
                    
    if (PreviousPage.IsCrossPagePostBack)
                    
    {
                        
    //将PreviousPage转换成与源网页相同的强类型
                        Default3 sourcePage = (Default3)PreviousPage;
                        Response.Write(sourcePage.A);
                    }

                }

            }

            
    catch
            
    {
            }


            
    try
            
    {
                
    if (PreviousPage != null)
                
    {
                    
    if (PreviousPage.IsCrossPagePostBack)
                    
    {
                        
    //将PreviousPage转换成与源网页相同的强类型
                        Default5 sourcePage = (Default5)PreviousPage;
                        Response.Write(sourcePage.GetA());
                    }

                }

            }

            
    catch
            
    {
            }

        }

    当然,也可以使用反射,从而写得不这么麻烦。
    还有PreviousPage的IsCrossPagePostBack属性,判断页面是否来自“跨网页公布”。(异曲同工于IsPostBack)

    “跨网页公布”原理:
    1.用户在源页面A按下Button后,根据其PostBackUrl属性,导向目标页面B
    2.B页面将A页面的ViewState另外存储一份后,销毁A页面的ViewState
    3.当在B页面中使用PreviousPage时,系统会自动初始化与A页面同一类型的Page,将其赋予PreviousPage,并在B页面Load_Complete阶段将原先保存的A页面ViewState还原给PreviousPage
    4.使用PreviousPage这个与源页面A相同的实体

    可以看到,“跨网页公布”的成本是很高的。

  • 相关阅读:
    objc_setAssociatedObject 使用(转)
    UIWebView加上safari风格前进后退按钮(转)
    解决 ios7.0 以后自定义导航栏左边按钮靠右的问题
    iOS开发中邮箱,电话号码,身份证,密码,昵称正则表达式验证
    利用openURL,在IOS应用中打开另外一个应用
    点击按钮打开文件
    CString的中文显示乱码的解决办法
    Unicode字符集和多字节字符集关系(转载)
    MFC基础--C++中的字符集(转自MSDN)http://msdn.microsoft.com/zh-cn/library/06b9yaeb(v=vs.90).
    MFC基础--CString的Tokenize()和_tcstok()的用法对比
  • 原文地址:https://www.cnblogs.com/Jax/p/722927.html
Copyright © 2020-2023  润新知