Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET/JavaScript-脚本注册/重定向问题_Javascript_Asp.net_Redirect_Page Lifecycle_Registerstartupscript - Fatal编程技术网

ASP.NET/JavaScript-脚本注册/重定向问题

ASP.NET/JavaScript-脚本注册/重定向问题,javascript,asp.net,redirect,page-lifecycle,registerstartupscript,Javascript,Asp.net,Redirect,Page Lifecycle,Registerstartupscript,我的页面上有一个提交按钮(服务器端按钮) 以下是我的点击事件代码: protected void SubmitButton_Click(object sender, EventArgs e) { db.SaveSomething(); Page.ClientScript.RegisterStartupScript("someScriptWhichReliesOnServerData"); Response.Redirect("SomeOtherPage.aspx"); }

我的页面上有一个提交按钮(服务器端按钮)

以下是我的点击事件代码:

protected void SubmitButton_Click(object sender, EventArgs e)
{
    db.SaveSomething();
    Page.ClientScript.RegisterStartupScript("someScriptWhichReliesOnServerData");
    Response.Redirect("SomeOtherPage.aspx");
}
现在,问题是,我使用
Page.ClientScript.RegisterStartupScript
注册JavaScript,但这不会产生任何效果,因为页面不会在回发时重新呈现(脚本将在回发时执行),因为会发生
响应.Redirect

我能想到的唯一解决方案是让我重定向到的页面“意识到”我试图执行一些JavaScript,可以是QueryString、HttpContext.Current.Items或(gulp)会话

  • QueryString-不是一个选项,因为它是我试图执行的JavaScript
  • HttpContext.Current.Items-也不是一个选项,因为我正在执行Response.Redirect(这会丢失请求级别的数据,并且我也无法使用Server.Transfer,因为这不利于URL重写)
  • 当然,但并不理想
还有其他想法/建议吗

编辑澄清:

JavaScript im执行是对Facebook客户端API的调用,以发布到用户的墙上。它必须在客户端完成。我将“标题”、“消息”、“操作链接”等内容传递给脚本,基本上是一堆JSON。但这里的关键是,这些数据是在回发时创建的,所以我不能只在客户端单击时执行此功能


因此,我试图完成的是单击submit按钮,执行一些javascript并执行重定向(不必按此顺序,只是两者都需要执行)。

如果使用
Response.redirect
,则不会执行您在前一行注册的java脚本。我认为单击“提交”按钮后要做的是:

  • 保存一些东西
  • 执行javascript
  • 重定向到另一页
  • 在这里,您可以使用:

    protected void SubmitButton_Click(object sender, EventArgs e)
    {
        db.SaveSomething();
        Page.ClientScript.RegisterStartupScript("someScriptWhichReliesOnServerData");
        Page.ClientScript.RegisterStartupScript("window.location.href=XXXXXX");
    }
    

    也就是说,使用javascript重定向页面而不是
    响应。重定向

    您可以在第二个页面上运行javascript吗

    除此之外,您的选择有些有限。您可以使用AJAX从服务器获取所需的数据,然后重定向。这将改善用户体验,因为至少您不会有额外的页面负载来运行中介JavaScript


    另一个选项是使用,其工作原理类似于
    Response.Redirect
    ,但它不向客户端发送重定向头。它只是告诉服务器“停止运行当前页面并开始执行新页面”<代码>上下文。项
    将保留在两个类之间的范围内,因为您只转移响应请求的责任,而不是请求的整个上下文



    您还可以将这两种解决方案结合起来。使用
    Server.Transfer
    在范围内保留
    上下文。项
    值,然后使用从第一页保留的值在第二页上呈现JS。

    我认为您正在经历的是两种不同范例的不幸冲突。一方面,您有一个想要利用的AJAX风格的API,另一方面,您有ASP.Net页面回发模型

    现在,虽然这两者并不相互排斥,但也可能带来一些挑战。我同意您的最佳选择是更多地转向AJAX方法,而不是相反

    ASP.Net中的一个很好的特性是能够将页面中的单个静态方法转换为伪web服务。然后,您可以使用ScriptManager生成客户端代理类来为您调用该方法,但您可以使用

    一个非常简单的例子:

    在你的代码背后为你页

    [WebMethod]
    public static Person GetPerson(Int32 id, String lastName)
    {
        return DataAccess.GetPerson(id, lastName);
    }
    
    如果您使用ASP.NETAjax库来处理这个问题,那么您需要启用页面方法来生成客户端代理

    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
    </asp:ScriptManager>
    
    现在,这又是一个人为的例子,您向服务器发布的内容可能非常复杂,但是您已经大致了解了使用内置框架组件可以实现什么


    我希望这能有所帮助。

    如果您能描述一下您试图实现的目标,那就太好了,因为可能有更好的解决方案。有很多方法可以解决这个问题,但也有很多方法可能不适合你的具体情况。@Josh-question。更好吗?跨页面回发不是一种选择吗?@Jim如果你曾经使用过ASP.NET表单,你就会明白跨页面回发对于ASP表单中的任何情况都不是一个简单的解决方案:-/@Dan我每天都使用Web表单,但我从来没有遇到过这个问题或类似的限制。此外,我从未使用过跨页回发,但我想知道为什么没有列出这种可能性。每当我的javascript依赖于某些服务器端数据时,我都会使用AJAX.NET Pro或page方法。我怀疑这两种方法在这种情况下是否有用,因为其中涉及用户信息。我想到了这一点,但这会重新呈现页面,然后在页面加载后执行重定向。不好,当你点击提交按钮时,当然会刷新页面。所以你不想提神?你不明白。在第一个页面的Submit按钮上单击,这会发回服务器,然后服务器会执行Response.Redirect-因此第二个页面被呈现。所以它不会刷新同一个页面(如果我没有Response.Redirect,默认情况下会发生这种情况),它会呈现第二个页面。知道我的意思吗?所以你希望javascript在第二页执行,而不是第一页?您正在找到一种方法来告诉第二个页面执行js?没错。我只需要在第1页的回发上执行一些javascript并重定向到第2页。正如我的问题所述,我无法将脚本注册到第1页的回发中,作为响应。重定向将忽略这一点。因此,我必须在第2页执行它。问题是如何给Page2足够的信息来做这件事。谢谢。我已经试过了
    function CallGetPerson() 
    {
         var id = $get("txtPersonId").value;
         var lastName = $get("txtLastName").value;
         // PageMethods is a class that is part of the ASP.Net AJAX
         // client-side libraries and will contain your auto-generated
         // proxy methods for making XHR requests.
         PageMethods.GetPerson(id, lastName, OnGetPersonComplete);
    }
    
    function OnGetPersonComplete(result)
    {
        faceBookApi.DoSomeStuffWithJson(result);
        window.location = "NewPage.aspx";
    }