我有两个SqlDataSources和两个Repeater,每个转发器包含一个超链接(我也尝试使用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>
现在!每次我点击任何超链接,它会导致完整的帖子返回并刷新页面!我错过了什么吗?
答案 0 :(得分:2)
非常确定<asp:HyperLink>
不会让您获得部分更新,它会将HTML呈现为<a href="..">
标记。您需要一个实际导致回发的控件,<asp:Button>
或<asp:LinkButton>
。
答案 1 :(得分:1)
首先,您要传回的任何值都不使用查询字符串,而是使用相同的页面。 将内容放在隐藏字段或按钮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”,这将导致updatepanel仅在发生以下任一情况时更新:
1)如果updatepanel中的控件导致回发,例如asp.net按钮。
2)如果更新面板上出现触发器(关于触发器:http://www.asp.net/web-forms/tutorials/aspnet-ajax/understanding-asp-net-ajax-updatepanel-triggers)
3)最后如果调用“Update()”方法
否则,它将不会更新和刷新。当它设置为always时,updatepanel或其他updatepanel之外的任何回发都可以触发updatepanel刷新。