2

可能是我错过的一个简单的疏忽(尽管我隐约记得一些关于 Response.Write 内部运作的晦涩博客文章在某些情况下无法按预期工作,但我不记得这是否是其中之一):

情况是,我在 SP2010 中运行的控件上有一个链接按钮,如果我不使用 HttpContext.Response.Write(),一切都会按预期工作(即我可以更改标签的 .Text 值)。但是,如果我调用 Context.Response.Write(),虽然我可以调试和单步执行代码,但似乎什么都没有发生(什么都没有写回,也没有出现对其他控件的更改)。它正在 _layouts 中的应用程序页面上运行,出现在模式对话框中。

(基本上,我正在尝试这样做 - http://acveer.wordpress.com/2011/01/25/using-the-sharepoint-2010-modal-dialog/但它不起作用。编辑:如果我改成asp:Button,还是不行)

如果您有兴趣,这里有一些代码:

.aspx:

@ Page Language="C#" AutoEventWireup="true" ... 
<asp:LinkButton CssClass="button remove" runat="server" OnClick="remove_Click" Text="Remove" ID="remove"></asp:LinkButton>

.aspx.cs:

    public void remove_Click(object sender, EventArgs e)
    {
        ....

        //if successful
        HttpContext context = HttpContext.Current;
        if (HttpContext.Current.Request.QueryString["IsDlg"] != null)
        {
            testControl.Text = "test code";

            //doesn't work, and prevents line above from working
            Context.Response.Write("<script type='text/javascript'>alert('hi!');</script>");
            Context.Response.Flush();
            Context.Response.End();

           // context.Response.Write("<script type='text/javascript'>window.frameElement.commitPopup()</script>");
           // context.Response.Flush();
           // context.Response.End();
        }           
    }

有人遇到过类似的事情吗?

编辑:一些更有趣的作品可能会有所帮助,

  • 按钮本身位于 UpdatePanel 中
  • 我确实分配了 AsyncPostbackTrigger
4

3 回答 3

3

从后面的 Web 表单代码中使用 Response.Write 充其量是有问题的。根据经验:永远不要从 Web 表单页面或用户控件中使用 Response.Write。

Response.Write 存在问题的原因是它不是页面控制树和渲染基础设施的一部分。这意味着当在事件中使用时,它将在正常页面流之外输出文本,并且通常在正确的 HTML 页面结构之外。

这也是当您将它们与 UpdatePanel 结合使用时出现问题的原因。由于 UpdatePanel 是专门为替换页面中的部分而设计的,因此基础架构需要知道哪些部分。Response.Write 完全在此之外发生,并且没有真正的方法知道在哪里呈现它。最好的情况是,ScriptManager 会执行一个 Response.Clear 来清除您的 Response.Writes,最坏的情况是您会破坏 UpdatePanel 协议主体并且您会收到一个 JavaScript 错误。

<script>最重要的是,当您执行部分页面更新时,任何文字标记都将被忽略,因为innerHTML用于填充服务器发送的 HTML 片段的浏览器功能不会执行<script>标记。

现在,抛开所有这些理论——没有办法通过 UpdatePanel 执行一段 JavaScript 代码吗?事实证明,它比仅仅执行 Response.Write: ScriptManager.RegisterClientScriptBlockScriptManager.RegisterStartupScript干净得多。例如:

ScriptManager.RegisterClientScriptBlock(
    theButton, // control or UpdatePanel that will be rendered
    typeof(YourPage), "UniqueKey", // makes your script uniquely identifiable
    "alert('Testing!');", true);

重要的部分是第一个参数:现在 ScriptManager 将知道何时执行您的脚本。如果在部分页面刷新时未更新的控件上注册它,您的脚本将不会执行。但是,如果刷新了包含控件的 UpdatePanel 则连接到它的脚本也将执行。这通常正是您想要的。

如果你总是想执行你的脚本,无论哪个面板更新,你都会调用

ScriptManager.RegisterClientScriptBlock(Page, ... );
于 2012-08-08T15:05:47.623 回答
3

@Ruben 提供了一个很好的答案,但我觉得我可以添加不适合评论的有用内容。

在 SharePoint 中有几个使用 Response.Write 的场合 - 即在处理显示在 SharePoint 模态弹出窗口中的 web 部件时,您希望在使用window.frameElement.commitPopup().

您在更新面板中使用 Response.Write 的事实实际上是您的问题的一部分。当使用更新面板生成的回发返回时,响应的格式为与更新面板关联的 divUpdatePanelId|Response Content所在的位置,并且是该 div的新内部 HTML。当您使用 response.write 时,该格式会丢失,因此 ScriptManager 不知道如何处理响应并应将其视为错误而忽略。@Ruben 为您提供了一种在 UpdatePanel 中注册脚本的方法。UpdatePanelIdResponse Content

于 2012-08-08T15:15:12.533 回答
2

Context.Response... 应该有一个小写的上下文

IE:

context.Response.Flush()

ETC

还是我错过了重点?

于 2012-08-08T13:53:59.520 回答