【问题标题】:Page still refreshes after wrapping the repeater in an update panel将转发器包装在更新面板中后,页面仍会刷新
【发布时间】:2011-05-19 10:41:32
【问题描述】:

我有两个 SqlDataSource 和两个中继器,每个中继器包含一个超链接(我也尝试使用 Web 服务器按钮和锚点)。

超链接从数据库中获取一些值,在 NavigationUrl 属性中,我使用 string.Format 方法创建参数化 url,传递给浏览器,然后根据 url 中传递的值填充第二个转发器,即最初是通过第一个转发器的超链接传递的

这是我的示例代码:https://gist.github.com/726213

<asp:ScriptManager id="Scrptmanagr"  runat="server"></asp:ScriptManager>
<asp:UpdatePanel id="updtpanl" runat="server">
    <ContentTemplate>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:testConnectionString %>" 
            SelectCommand="SELECT [arrange_by_id], [arrange_by] FROM [arrange_by]">
        </asp:SqlDataSource>
        <asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1">
            <ItemTemplate>
                <asp:HyperLink ID="HyperLink3" NavigateUrl='<%# string.Format("{0}?SortingType={1}",Request.AppRelativeCurrentExecutionFilePath, Eval("arrange_by_id"))%>' runat="server"><%# Eval("arrange_by") %></asp:HyperLink>
            </ItemTemplate>
            <SeparatorTemplate>
                |
            </SeparatorTemplate>
        </asp:Repeater>
        <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:testConnectionString %>" 
            SelectCommand="SELECT [alphabet_id],[arrange_by_id], [value] FROM [alphabet] WHERE ([arrange_by_id] = @arrange_by_id)">
            <SelectParameters>
                <asp:QueryStringParameter Name="arrange_by_id" QueryStringField="SortingType" Type="Int32" DefaultValue="1" />
            </SelectParameters>
        </asp:SqlDataSource>
        <br /><br />
        <asp:Repeater ID="Repeater2" runat="server" DataSourceID="SqlDataSource2">
            <ItemTemplate>
                <asp:HyperLink  ID="hyper1" runat="server" NavigateUrl='<%#string.Format("{0}?SortingType={1}&SortBy={2}",Request.AppRelativeCurrentExecutionFilePath, Eval("arrange_by_id"),Eval("value"))%>'><%# Eval("value")%></asp:HyperLink>
            </ItemTemplate>
            <SeparatorTemplate>
                |
            </SeparatorTemplate>
        </asp:Repeater>
    </ContentTemplate>
</asp:UpdatePanel>

现在!每次我单击任何超链接时,都会返回一个完整的帖子并刷新页面!我错过了什么吗?

【问题讨论】:

    标签: c# javascript asp.net ajax webforms


    【解决方案1】:

    很确定&lt;asp:HyperLink&gt; 不会让您获得部分更新,它会以&lt;a href=".."&gt; 标记的形式呈现为HTML。您将需要一个实际导致回发的控件,&lt;asp:Button&gt;&lt;asp:LinkButton&gt;

    【讨论】:

    • 是的,不幸的是,我尝试过使用 asp.net 按钮,但还是一样!
    • 不要把 PostBackUrl 放在那里!您正在强制它不回发到您的当前页面,因此它不能包含在部分更新中。只需使用 OnClick 事件执行 &lt;asp:Button&gt;!或者,如果您喜欢在 URL 中包含所有内容的方法,也许您最好只使用 iframe 而不是 &lt;asp:UpdatePanel&gt;
    • 我不喜欢任何方法,这正是我想到的!如果您有任何建议将参数传递给 url,请分享它!我希望我能学到更好的方法!
    • 好吧,我有点卡在这里了!链接按钮或按钮在中继器内时不能有 OnClick 事件!相反,您使用 CommandArgument 属性并在中继器的 itemCommand 事件中搜索它!....现在怎么可能让 onClick 事件或其他 = ' Text='!!
    • 如果您想转到查询字符串中的新 URL,则不能进行部分页面更新。就这么简单。这不是部分页面更新的工作方式。它们涉及停留在同一页面、同一 URL 以及更新部分页面内容。
    【解决方案2】:

    首先,您要传回的任何值都不要使用查询字符串,它是同一页面。 将内容放在隐藏字段或按钮 CommandArgument 中

    <asp:HiddenField ID="hdnFieldName" Value='<%# Eval("columnName") %>' runat="server" />
    

    然后在后面的命令上

        protected void rptName_ItemCommand(object source, RepeaterCommandEventArgs e)
        {
            if(e.CommandName.Equals("ButtonCommandName"))
            {
                RepeaterItem objItem = e.Item;
                var objFieldValue = (HiddenField)objItem.FindControl("hdnFieldName"); 
            }
        }
    

    记得设置更新面板 Mode="conditional' 这将导致更新面板仅在以下情况之一发生时更新:

    1) 如果更新面板中的控件导致回发,例如asp.net 按钮。

    2)如果更新面板上发生了触发器(关于触发器:http://www.asp.net/web-forms/tutorials/aspnet-ajax/understanding-asp-net-ajax-updatepanel-triggers

    3) 最后如果调用“Update()”方法

    否则,它不会更新和刷新。当其设置为始终时,更新面板或其他更新面板之外的任何回发都可以触发更新面板刷新。

    【讨论】:

    • 好吧,尼克,这是有道理的..所以我将在内部传递第二个中继器的值,而不是通过查询字符串(对不起!我错误地使用了查询字符串:S)..但作为你看我想要一种特殊的排序,那么我怎样才能使页面按名称排序,例如“书签”?另一件事!如果我想使用 commandArgument 以及用于第二个中继器数据源的代码是什么,我不知道代码是什么?!因为它不会让我选择指定要使用的控件 - 我不确定要选择什么作为我的 where 参数值的源,或者我做错了 -
    猜你喜欢
    • 1970-01-01
    • 2014-03-09
    • 2017-04-09
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2016-12-10
    相关资源
    最近更新 更多