【问题标题】:asp.net 4.5 PreviousPage is null with cross page posting using a master pageasp.net 4.5 PreviousPage 为空,使用母版页进行跨页发布
【发布时间】:2015-05-28 01:15:14
【问题描述】:

注意事项:

  • 我使用的是 asp.net 4.5
  • 我正在使用母版页
  • 默认安装FriendlyURLs
  • 我正在尝试使用 POST 方法跨页发布

在目标网址上,它返回PreviousPage = null

这是由于 FriendlyURls 造成的吗?

来源:

<asp:Button ID="btnSubmit" class="btn btn-primary" PostBackUrl="~/NewApplicationConfirmation.aspx" runat="server" Text="Submit" />

目标:

protected void Page_Load(object sender, EventArgs e)
    {
        if (PreviousPage != null)
        {
            if (PreviousPage.IsCrossPagePostBack == true)
            {
                var cp = PreviousPage.Master.FindControl("MainContent") as ContentPlaceHolder;
                TextBox PrevinputAppName = cp.FindControl("inputAppName") as TextBox;
                inputAppName.Text = PrevinputAppName.Text;
            }
            else if (PreviousPage.IsCrossPagePostBack == false)
            {
                inputAppName.Text = "page.previouspage.iscrosspagepostback is false";
            }
        }
        else inputAppName.Text = "page.previouspage is null";
    }

编辑:我最终使用这段代码来解决我的问题:

.aspx

<asp:Button ID="btnSubmit" class="btn btn-primary" onclick="Transfer_Click" runat="server" Text="Submit" />

代码隐藏

protected void Transfer_Click(object sender, EventArgs e)
        {
            if (Page.IsValid)
            {
                Server.Transfer("~/NewApplicationConfirmation.aspx");
            }
        }

【问题讨论】:

    标签: c# asp.net cross-page-posting


    【解决方案1】:

    您的问题实际上并不是因为 FriendlyUrls,您的问题是因为您在应用程序中使用了路由(如果您手动定义路由而不是让 FriendlyUrls 为您连接它们,您会遇到同样的问题)。如果您将 PostbackUrl 属性更改为您的应用程序用于该页面的任何路由(可能是 ~/NewApplicationConfirmation?),那么 PreviousPage 将不再为空。但是,由于 ASP.NET 验证前一页的方式,如果您为 that 页面设置了路由别名,则可能会遇到更多问题。我会说您应该使用 PreviousPage 而没有路由,或者路由并更改您的代码以查看 Request.Form 以获取发布到它的值。

    【讨论】:

    • 真是一团糟。为避免这种情况,我使用了 server.transfer - 这避免了(出于某种原因)问题和 previouspage 工作和 findcontrol 工作,我不需要禁用friendlyurls 和路由工作。我认为您是正确的,“在我看来,这里的问题是 OP 遇到了无扩展名 url,因此当框架寻找跨页面回发到无扩展名 url 时,它找不到任何内容,因为没有扩展名在技术上与 PostbackUrl 中定义的页面不同。”
    • @WillHoward 您可能会在使用Server.Transfer 时遇到背部等问题,具体取决于您的实施方式。最好将您的实现切换为使用Request.Form["input"],而不是在PreviousPage 上使用FindControl。或者您可以将其发布回同一页面(尽管我确信您有理由进行跨页面发布)。
    【解决方案2】:

    你需要添加指令:

    <%@ PreviousPageType virtualPath="~/PreviousPage.master"%>
    

    请参阅 Microsoft 的 documentation,了解如何使用 PreviousPages。

    您也可以尝试Microsoft article 中的提示

    【讨论】:

    • 这只会使PreviousPage 属性成为强类型属性,但它仍然为空。
    • 实际上,我以为您在谈论使用PreviousPageType 指令。这只会强类型化母版页,甚至没有被代码引用?
    • 天啊!查错了类型...(需要...更多...咖啡...)
    • 我从来没有在没有强输入的情况下让 PreviousPage 工作......但我在 .NET 4.0 上,我不知道这在 4.5 中是否发生了变化......并且自从 OP正在尝试访问上一页的主人,我认为他也需要参考那里的主人。
    • 是的,如果您需要获取页面的特定属性,则需要强输入。至于母版页,OP 甚至无法到达代码的那个区域,但由于 MasterPage 类型实现了控制(暴露 FindControl),因此不需要键入它。无论如何,在我看来,这里的问题是 OP 遇到了无扩展名 url,所以当框架寻找跨页面回发到无扩展名 url 时,它找不到任何内容,因为没有扩展名的目标在技术上不是与 PostbackUrl 中定义的页面相同。
    猜你喜欢
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 2012-02-08
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    相关资源
    最近更新 更多