【问题标题】:ASP.Net manual postback not working from dynamically created linkbuttonASP.Net 手动回发不适用于动态创建的链接按钮
【发布时间】:2012-11-22 00:59:53
【问题描述】:

我正在尝试实现手动回发以触发未附加到控件的代码。我不想使用 AJAX PageMethods,因为我需要在回发期间引用某些控件,并且希望结果更新到页面上的 gridview。

我已经有另外两种可行的方法,但出于某种原因,我的第三种方法没有部署一次,但确实在我的开发机器上运行良好。

代码隐藏(Page_load)

        switch (Request["__EVENTARGUMENT"]) {
            case "ItemReserved":
                GetAllStock();
                break;
            case "PendingItemRemoved":
                PopulatePending();
                break;
            case "StockInSubmitted":
                SubmitNewStock();    // this doesn't fire
                break;
        }

代码一到达“SubmitNewStock()”,我就插入了一行写入日志文件。日志写在我的开发机器上,但没有写在网络服务器上。其他两个回发都按预期工作。

页面脚本

    function ctxMenu_Reserve() {
        PageMethods.SetItemReserved(CGRefForMenu);
        __doPostBack('', 'ItemReserved');

        HideMouseMenu();
    }

    function ctxMenuPending_Remove() {
        PageMethods.RemovePendingItem(CGRefForPendingMenu);
        __doPostBack('', 'PendingItemRemoved');
    }

    function StockINSubmit(){
        SubmitPlaceHolder = document.getElementById('<%=PlaceholderStockInSubmit.ClientID %>');
        SubmitPlaceHolder.innerHTML = "Processing...";

        __doPostBack('', 'StockInSubmitted');  //Causes postback, but relevant code is not triggered once on my live server
    }

有人知道为什么在我将网站部署到我的实时网络服务器后这不起作用吗?

我应该提到 StockINSubmit() 是从一个动态创建的客户端链接按钮启动的,该按钮位于模式弹出框内。

        PlaceholderStockInSubmit.Controls.Add(
            new LinkButton() {
                OnClientClick = "StockINSubmit()",
                Text = "Submit",
                ID = "lnkStockInSubmit"
            });

StockINSubmit() 替换包含该按钮的 DIV 的 HTML 内容。 (所以我点击“提交”,它变为“处理”标签)。我看不出这会导致任何问题的原因,但认为值得一提。

【问题讨论】:

  • 不知道,但是一旦我尝试调用 __doPostBack 才意识到 __doPostBack 仅在存在需要 JS 回发模拟器的控件时才会呈现。所以我在页面上添加了一个链接按钮。检查 __doPostBack 是否在呈现的标记中。
  • 我已经回答了一个关于如何使用托管代码正确创建 __doPostBack 的问题:stackoverflow.com/questions/10483271/…
  • @MatthewMartin __doPostback 确实被渲染到页面上,因为我有很多与它们相关联的回发控件。
  • @CAbbott 我看了这个,但是如何获得一个事件的 PostBackEventReference(没有控制)。尝试此操作时出现编译错误
  • 拥有一个动态添加的控件确实让它变得更加棘手。有一个控件(LinkBut​​ton),但我猜您需要为动态添加的控件使用 PostBackEventReference。

标签: asp.net dopostback


【解决方案1】:

我终于弄清楚发生了什么......

动态创建的链接按钮作为其服务器单击 (onClick) 事件的一部分执行回发(尽管我没有将任何事件绑定到它)。在我的开发机器上,OnClientClick 事件回发优于 OnClick 回发,因此所有预期代码都正常运行。

由于某种原因,一旦部署到服务器上,服务器的 OnClick 事件将击败 OnClientClick 事件,因此在没有 OnClientClick 事件提供的额外 __EVENTARGUMENT 信息的情况下发生了完整的回发。

为了解决这个问题,我发现 another post on this site 解释了如何取消默认回发,但仍执行客户端 javascript。

我的服务器端代码现在更新如下:

    LinkButton newButton = new LinkButton() {
        OnClientClick = "StockINSubmit()",
        Text = "Submit",
        ID = "lnkStockInSubmit"
    };
    newButton.Attributes.Add("onClick", "return false;");
    PlaceholderStockInSubmit.Controls.Add(newButton);

它现在就像一个魅力:)

感谢你们的帮助。

【讨论】:

    猜你喜欢
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多