更新面板和重复控件触发器

7

您好,我在网上找到了与以下代码类似的内容。这对于让嵌入在重复控件中的按钮触发完整服务器周期似乎非常有用。

<asp:ScriptManager ID="ScriptManager1" runat="server"> 
        </asp:ScriptManager> 

        <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
            <ContentTemplate> 
                <%=DateTime.Now.ToString() %> 
            </ContentTemplate> 
            <Triggers> 
                <asp:PostBackTrigger ControlID="HiddenButton" /> 
            </Triggers> 
        </asp:UpdatePanel> 

        <!--Make a hidden button to treat as the postback trigger--> 
        <asp:Button ID="HiddenButton" runat="server" Style="display: none" Text="HiddenButton" /> 


        <asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1"> 
            <ItemTemplate> 
                 <!--when cick the button1, it will fire the hiddenButton--> 
                <asp:Button ID="Button1" Text="Trigger" CommandArgument='<%# Eval("Id") %>' OnClientClick="$get('HiddenButton').click();return false;" 
                    runat="server" /> 
            </ItemTemplate> 
        </asp:Repeater>

它使用一个hiddenButton通过钩子来处理原始按钮的点击事件。不过,我的补充是设置了按钮的CommandArgument。我也需要为HiddenButton设置它。有人知道如何处理这个问题吗?

我将把这个作为评论而不是答案发布,因为我不确定它是否有效,但你可以尝试使用这个建议创建自己的属性并设置它。 - Town
我认为你甚至不需要JavaScript。移除HiddenButton和<Triggers>,当你点击“Button”时,updatepanel将被刷新。所以你的意思是你需要一个AsyncPostBackTrigger吗? - Dan An
2个回答

13

首先,我想解释一下使用Update Panel缺点,并使用你发布的相同示例。

以下是原始代码

enter image description here


输出结果

enter image description here


为了显示这个22个字符的字符串,您可以检查接收和发送到服务器的数据量。请想象一下以下情况:

  1. 如果您考虑使用Update Panel将每个请求发送到数据库,并且您的GridView位于Update Panel中!!!
  2. 假设您将对每个请求使用ViewState数据,并使用位于Update Panel中的GridView

根据我的理解,上述两种技术都很糟糕。


现在我将向您描述页面方法

页面方法与更新面板

页面方法允许ASP.NET AJAX页面直接执行页面的静态方法,使用JSON(JavaScript对象表示法)。我们可以使用Web方法仅请求我们感兴趣的信息,而不是回发然后接收HTML标记以完全替换我们的UpdatePanel的内容

示例代码

enter image description here enter image description here


输出结果

enter image description here

希望这清楚地解释了使用的区别。


回答原始查询

您必须注册下面RepeaterItemDataBound事件,并对其使用以下代码。

后端代码

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || 
                           e.Item.ItemType == ListItemType.AlternatingItem)
    {
        Button btn = (Button)e.Item.FindControl("Button1");
        btn.OnClientClick = string.Format("SubmitButton('{0}');return false;"
                                                        , HiddenButton.ClientID);

    }
}

JavaScript

<script type="text/javascript">
     function SubmitButton(btn)
     {
         $("#" + btn).click(); 
     }
</script>

//替代方案

<script type="text/javascript">
     function SubmitButton(btn)
     {
         document.getElementById(btn).click(); 
     }
</script>

参考 & 这里


0

你的 HiddenButton 控件是一个服务器控件,但你试图使用它的 ASP.Net ID 在 JQuery 中访问它,

<asp:Button ID="Button1" Text="Trigger" CommandArgument='<%# Eval("Id") %>' OnClientClick="$get('**HiddenButton**').click();return false;" 
                runat="server" /> 

一个快速解决的方法是创建一个单独的函数,
<script type="text/javascript">
function SubmitButton(btn)
{
     $get("#" . btn).click(); 
}
</script>

并将您的按钮代码更改为,

<asp:Button ID="Button1" Text="Trigger" CommandArgument='<%# Eval("Id") %>' 
                runat="server" /> 

在代码后台,在重复器的ItemDataBound事件中,查找按钮和HiddenControl,并设置Button1的OnClientClick属性。
Button1.OnClientClick= string.Format("SubmitButton('{0}');return false;",HiddenButton.ClientID); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接