为什么Page.PreviousPage始终为null?

时间:2014-01-24 02:18:16

标签: asp.net webforms cross-page-posting

我正在按照this MSDN article尝试跨页面发布。我有这段代码:

CrossPagePosting1.aspx

<form id="form1" runat="server">
    <h1>Page 1</h1>
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br />
    <asp:Button ID="Button1" runat="server" Text="Button" PostBackUrl="CrossPagePosting2.aspx"/>
</form>

CrossPagePosting2.aspx

<form id="form1" runat="server">
    <h1>Page 2</h1>
    <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
</form>

CrossPagePosting2.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    TextBox TextBox1 = (TextBox)Page.PreviousPage.FindControl("TextBox1");
    Label1.Text = TextBox1.Text;
}

以上代码在NullReferenceException生成Page.PreviousPage。为什么呢?

这是一个ASP.Net 4.0应用程序。

它使用FriendlyUrls,这是默认值。

注意:我不希望上一页是强类型的,例如使用PreviousPageType指令。根据引用的文章,这不是必要的。

5 个答案:

答案 0 :(得分:6)

我发现友情网址可能会让您遇到此问题。默认情况下,Web窗体模板包含ASP.NET友好URL。

使用visual Studio中的默认WebForm时,AutoRedirectMode设置为Permanent。这使您请求进入“GET”,并且由于您使用的是友好URL,因此无法评估PreviousPage。

<强>解决方法:

  • 如果您想要“POST”操作,请设置AutoRedirectMode = RedirectMode.Off(这将为您提供PreviousPage信息,但仅限于 非友好的网址[例如:www.you.com/mypage.aspx],不过这个 如果您尝试访问Friendly-Url页面会出现错误[例如: www.you.com/mypage]&lt;&lt;没有.aspx)。

  • 如果您需要PreviousPage信息,则必须设置 您网页中的上一篇文章指令&lt;%@ PreviousPageType VirtualPath =“〜/ Page1.aspx”%&gt;或者也许在a中使用Server.Transfer OnClick方法。

答案 1 :(得分:1)

这里的问题是由FriendlyUrls引起的,它默认安装在我正在使用的测试站点上。我禁用了FriendlyUrls,它运行良好。

答案 2 :(得分:-1)

我认为以下文章会对您有所帮助。

http://csharpdotnetfreak.blogspot.com/2009/08/cross-page-posting-in-aspnet.html

有两种方法如何使用Cross Page Posting PostBack

答案 3 :(得分:-1)

发生这种情况的原因很简单,因为您没有正确设置postbackurl属性。

如果CrossPagePosting2.aspx位于您的程序的根目录,请将postbackurl更改为~/CrossPagePosting1.aspx

您无需添加&lt;%@ PreviousPageType%&gt;使用postbackurl属性时的指令。使用PreviousPage.FindControl(id)将搜索使用postbackurl属性

发布的表单元素

答案 4 :(得分:-1)

试试这个

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack && PreviousPage != null)
        {
            Page page = PreviousPage;
            Label1.Text = ((TextBox)page.FindControl("TextBox1")).Text;
        }
    }