jQuery的对话框的回发的UpdatePanel,但没有更新jQuery的对话框的回发的Updat

2019-05-12 05:47发布

我想说明从代码隐藏一个jQuery用户界面对话框,需要回传后刷新它。

该对话框是过滤和查找数据的控制。 因此,用户从DropDownLists选择并在文本框输入文本,点击一个“应用-按钮”,异步回发发生时,数据被根据用户的选择过滤,并且结果将在GridView显示。 因此我需要更新周围的GridView控件在UpdatePanel。

异步回发的作品与这些链接帮助:

  • jQuery UI的对话与ASP.NET按钮回传
  • http://blog.roonga.com.au/2009/07/using-jquery-ui-dialog-with-aspnet-and.html

(基本上dlg.parent().appendTo(jQuery("form:first"));溶液)

问题 :我不能更新在UpdatePanel既不与的UpdateMode =“始终”,也不是手动从经由UpdatePanel.Update代码隐藏()。 我认为它有事情做与对话不是在UpdatePanel类似的或内部。 希望有人能帮助我一起。

一些来源:

function createChargeFilterDialog() {
    //setup dialog
    $('#Dialog_ChargeFilter').dialog({
        modal: true,
        resizable: false,
        autoOpen: false,
        draggable: true,
        hide: "Drop",
        width: 850,
        height: 600,
        position: "center",
        title: "Charge-Filter",
        buttons: {
            "Close": function () {
                $(this).dialog("close");
            }
        },
        open: function (type, data) {
            $(this).parent().appendTo(jQuery("form:first"))
        },
        close: function (type, data) {
        }
    });
}

它从代码隐藏调用时BtnShowDialog(在jQuery的对话外)通过被点击

AjaxControlToolkit.ToolkitScriptManager.RegisterStartupScript _
            (Me.Page, GetType(Page), "showChargeFilterDialog", "createChargeFilterDialog();$('#Dialog_ChargeFilter').dialog('open');", True)

更新 :我已经还回传值注意的一个问题。 如果为空或不是所有的文本框有一个逗号追加。 这表明,控制是根据呈现多次: http://www.componentart.com/community/forums/t/60999.aspx

我敢肯定,这两个问题是相关的。 其所有控制整个对话将在每一个异步回重新创建,因此所有控件名称的DOM(导致ViewState的逗号追加发行)中存在多次。 的控制是仅在可见萤火虫/ IE Deveoper工具栏,而不是在HTML的来源,因此,我假定的jQuery引起这些问题。 我该如何处置该对话框或如何防止对话框的娱乐 (检查是否已经存在)? 这是因为对话框是一个UpdatePanel内还是因为它的移动(通过Javascript)在UpdatePanel外面?

销毁异步回发之前该对话框并不能解决问题,因为对话框将完全消失:

<asp:Button ID="BtnApplyFilter" OnClientClick="$('#Dialog_ChargeFilter').dialog('destroy');" ... />

你的帮助是极大的赞赏。


解决办法 :我使用的结束ModalPopupExtender从AjaxControlToolkit。 后其工作像异步回送一个魅惑的一些小问题(不要忘记调用MPE.Show()在每一个代码隐藏功能,如果你想弹出留可见)。 如果有人有兴趣,我可以添加更多的代码。

Answer 1:

我认为它有事情做与对话不是在UpdatePanel类似的或内部。

我也以回传值注意的一个问题。 如果为空或不是所有的文本框有一个逗号追加。

你的确是在这两方面是正确的。 问题的症结是,脚本管理器“认为”它应该更新它的jQuery实际上已经移动到页面上的其他位置的元素,从而导致元件和你所提到的问题的多个副本。

我已经使用嵌套的UpdatePanel看到这个问题,但它可能在其他情况下发生为好。

这是它的解决方法是凌乱的问题。

选项1 - 更改jQuery UI的源代码。 我没有用一个快速解决任何运气; 短重写整个插件,我找不到一个易于正确有对话工作没有重新排序的DOM。 此外,与这条路线,现在你“自己”的源代码,因为你已经修改了它。

选项2 - 调整每当页被部分地呈现除去重复元件DOM。 您可以输出一些额外的脚本来清理虚假重复的元素。 因为它允许DOM是处于无效状态,直到运行脚本,我不喜欢这种方式。

选择3 - 手动覆盖在UpdatePanel的呈现。 代码看起来是这样的:

private bool _hasDomPresence
{
    get
    {
        return ViewState["__hasDomPresence"] == null ? false : (bool)ViewState["__hasDomPresence"];
    }
    set
    {
        ViewState["__hasDomPresence"] = value;
    }
}

protected override void OnLoad( EventArgs e )
{
    if( !ScriptManager.GetCurrent( this.Page ).IsInAsyncPostBack )
    {
         // a full postback means we no longer have a DOM presence
         _hasDomPresence = false;
    }

    base.OnLoad( e );
}

protected virtual void ShowDetailDialog()
{
    // code to show the offending dialog

    // we are showing it, so note the fact that it now has a DOM presence
    _hasDomPresence = true;
}  

protected override void Render( HtmlTextWriter writer )
{
    foreach( Control c in this.Controls )
    {
        //
        // find the offending control's parent container prior to it being rendered
        // In my scenario, the parent control is just a server-side DIV
        if( c == this.DetailDialog )
        {
            //
            // here, I am checking whether or not the panel actually needs to be
            // rendered. If not, I set it to invisible, thus keeping a new DOM
            // element from being created.
            if( !this.DetailUpdatePanel.IsInPartialRendering && _hasDomPresence )
            {
                this.DetailUpdatePanel.Visible = false;
            }
        }
    }

    base.Render( writer );
}

这也将混淆事件验证,因为页面的客户端和服务器版本不匹配(或至少ASP.Net不能告诉他们这样做)。 我能找到使这项工作的唯一办法是关闭事件验证。

有了适当的安全模型,事件验证是不是100%必要的,但我不喜欢被人强行将其关闭。

总之,这是最邪恶的代码我已经张贴在SO和蓬松的白色小猫,如果你使用它会死,但这种方式似乎工作。

希望这可以帮助。



Answer 2:

下面是我如何解决同样的问题。 它消除了任何旧的对话,并增加了新的更新一回这样的回传工作的形式。 我把下面的代码在得到通过添加到页面的脚本块ScriptManager.RegisterStartupScript在后面的代码。

$('#divMyDialogAdded').remove();

$('#divMyDialog').dialog({
    autoOpen: false,
    modal: true
}).parent().appendTo('form:first');

$('#divMyDialog').attr('id', 'divMyDialogAdded');


Answer 3:

我不知道,但是这可能是BZ其工作权ANS形成我,当我使用

AjaxControlToolkit.ToolkitScriptManager.RegisterStartupScript

试试这个 ?

ScriptManager.RegisterClientScriptBlock(Me.Page, GetType(Page), "showChargeFilterDialog", "createChargeFilterDialog();$('#Dialog_ChargeFilter').dialog('open');", True)


Answer 4:

我认为jQuery和脚本管理/更新面板时生成和解析confilct它创建的脚本,你应该在更新面板的触发正确,才能在代码中使用此方法背后的事件处理:

       UpdatePanel2.Update();

所以我有这样的问题,可以通过下面的代码解决了这个问题(这是我的示例代码):

   <!--------- show for dialog --->
<div id="dialog" style="direction: rtl;">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <asp:UpdatePanel ID="UpdatePanel2" runat="server" RenderMode="Block" UpdateMode="Conditional" EnableViewState="True" ChildrenAsTriggers="True">
        <ContentTemplate>
            <div>
                <table>
                    <tr>
                        <td>
                            <asp:ListBox ID="lstSLA" runat="server" SelectionMode="Single" Width="250px" Height="350px">
                            </asp:ListBox>
                        </td>
                        <td valign="middle">
                            <asp:Button ID="BtnUpMove" runat="server" Text=" top" OnClick="BtnUpMove_Click" />
                            <div>
                                <br />
                            </div>
                            <asp:Button ID="BtnDownMove" runat="server" Text="down" OnClick="BtnDownMove_Click" />
                        </td>
                    </tr>
                    <tr>
                        <td colspan="2" align="center">
                            <asp:Button ID="btnSavePeriority" runat="server" Text="Save" OnClick="btnSavePeriority_Click" />
                        </td>
                        <td>
                        </td>
                    </tr>
                </table>
            </div>
        </ContentTemplate>
        <Triggers>
            <asp:PostBackTrigger ControlID="btnSavePeriority" />
            <asp:AsyncPostBackTrigger ControlID="BtnUpMove" EventName="Click" />
            <asp:AsyncPostBackTrigger ControlID="BtnDownMove" EventName="Click" />
        </Triggers>
    </asp:UpdatePanel>
</div>

和在C#代码:保护无效BtnUpMove_Click(对象发件人,EventArgs的){INT的SelectedIndex = lstSLA.SelectedIndex;

        if (SelectedIndex == -1) // nothing selected
        {
            UpdatePanel2.Update();
            return;
        }
        if (SelectedIndex == 0) // already at top of list  
        {
            UpdatePanel2.Update();
            return;
        }

        ListItem Temp;
        Temp = lstSLA.SelectedItem;

        lstSLA.Items.Remove(lstSLA.SelectedItem);
        lstSLA.Items.Insert(SelectedIndex - 1, Temp);
        UpdatePanel2.Update();
        lstSLA.SelectedIndex = -1;
    }
    protected void BtnDownMove_Click(object sender, EventArgs e)
    {
        int SelectedIndex = lstSLA.SelectedIndex;

        if (SelectedIndex == -1)  // nothing selected  
        {
            UpdatePanel2.Update();
            return;
        }
        if (SelectedIndex == lstSLA.Items.Count - 1)  // already at top of list            
        {
            UpdatePanel2.Update();
            return;
        }

        ListItem Temp;
        Temp = lstSLA.SelectedItem;

        lstSLA.Items.Remove(lstSLA.SelectedItem);
        lstSLA.Items.Insert(SelectedIndex + 1, Temp);
        UpdatePanel2.Update();
        lstSLA.SelectedIndex = -1;

    }
    protected void btnSavePeriority_Click(object sender, EventArgs e)
    {
        if (lstSLA.Items.Count == 0) return;
        try
        {
            var db = DatabaseHelper.GetITILDataAccess();
            ServiceLevel srvlvl = new ServiceLevel();
            int priority = 1;
            foreach (ListItem ls in lstSLA.Items)
            {
                srvlvl = new ServiceLevel();
                srvlvl = db.ServiceLevels.Single(p => p.ID == long.Parse(ls.Value));
                srvlvl.priority = priority;
                priority++;
                ServiceLevelManagement.Update(srvlvl);

            }
            ShowMessage(ITILMessages.InsertComplete);
        }
        catch (Exception ex)
        { }
        finally { }

    }


文章来源: jQuery Dialog-Postback but UpdatePanel doesn't get updated