2013-05-17 92 views
2

我有一個DataList,它們被加載到搜索結果(url,description,title)中。我需要知道用戶點擊搜索結果的URL。我使用linkbutton來做到這一點。但是,如果我在LinkBut​​ton控件中使用PostBackUrl屬性,OnClick處理程序無法調用。如何獲得linkbutton的url

//Default.aspx 
    <asp:Panel ID="panResults" runat="server" Height="236px"> 
     <p style="text-align: left" align="left"><asp:Label runat="server" ID="lblTotal" Font-Bold="true" /></p> 
     <asp:DataList ID="dlstResults" runat="server" CellPadding="4" 
      ForeColor="#333333" Width="100%" OnItemDataBound="DataList_ItemDataBound" > 
      <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
      <SelectedItemStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /> 
      <AlternatingItemStyle BackColor="White" ForeColor="#284775" /> 
      <ItemStyle BackColor="#F7F6F3" ForeColor="#333333" /> 
      <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
      <ItemTemplate> 
       <asp:LinkButton ID="lnkResultUrl" runat="server" OnClick="Link_Click" CommandArgument='<%# Eval("Url") %>' 
        PostBackUrl='<%# Eval("Url") %>' Text='<%# Eval("Title") %>' /> 
       <br /> 
       <asp:Label ID="lblResultUrl" runat="server" Font-Bold="true" 
        Text='<%# Eval("Url") %>' /> 
       <br /> 
       <asp:Label ID="lblResultSummay" runat="server" 
        Text='<%# Eval("Description") %>' /> 
      </ItemTemplate>  
     </asp:DataList> 
    </asp:Panel> 

//Code-behind 
protected void Link_Click(object sender, EventArgs e) 
{ 
    LinkButton btn = (LinkButton)(sender);  
    string myValue = btn.CommandArgument; 
} 
+0

鏈接按鈕支持命令參數和命令名稱屬性 –

+0

@Steve,這是什麼意思?在我的例子中,我使用CommandArgument。但是這不起作用,如果我放入PostBackUrl。 –

+0

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.datalist.itemcommand(v=vs.80).aspx處理這個事件,爲每個在命令參數中拋出url屬性(你正在做的),給它一個命令名,以便你知道哪個控件從事件處理程序中。 –

回答

3

你告訴你的DataList即每次發生事情(東西被點擊,或改變)在控制你的DataList控件調用該方法dlstResults_ItemCommand

您可以通過將屬性OnItemCommand="dlstResults_ItemCommand"放置在DataList中來實現此目的。

然後,您將構建您在上述屬性中鍵入的方法。在這種情況下,它被稱爲dlstResults_ItemCommand。然後在那裏通過檢查命令名稱(這是您的CommandArgument屬性放置的屬性)來檢查哪個控件引發了事件。如果它的權利控制,拔出命令參數,這就是你的網址。

<asp:DataList ID="dlstResults" runat="server" CellPadding="4" OnItemCommand="dlstResults_ItemCommand" 
     ForeColor="#333333" Width="100%" OnItemDataBound="DataList_ItemDataBound" > 
     <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
     <SelectedItemStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /> 
     <AlternatingItemStyle BackColor="White" ForeColor="#284775" /> 
     <ItemStyle BackColor="#F7F6F3" ForeColor="#333333" /> 
     <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
     <ItemTemplate> 
      <asp:LinkButton ID="lnkResultUrl" runat="server" CommandArgument='<%# Eval("Url") %>' CommandName="SomeName" 
       %>' Text='<%# Eval("Title") %>' /> 
      <br /> 
      <asp:Label ID="lblResultUrl" runat="server" Font-Bold="true" 
       Text='<%# Eval("Url") %>' /> 
      <br /> 
      <asp:Label ID="lblResultSummay" runat="server" 
       Text='<%# Eval("Description") %>' /> 
     </ItemTemplate>  
    </asp:DataList> 


protected void dlstResults_ItemCommand(Object sender, DataListCommandEventArgs e) 
{ 
    if(e.CommandName ="SomeName") 
    { 
     string url = e.CommandArgument.ToString(); 
     //url now holds the url of the clicked on link 
    } 

} 
+0

ItemCommand事件不會爲DataList觸發。 –

+0

@HelioGracie嗯......你是在重新綁定page_load上的datalist嗎?把它扔在一個!Page.IsPostBack條件....如果這不起作用嘗試手動鏈接事件到設計器中的事件處理程序(或地獄,甚至頁面加載可能工作) –

+0

我把數據綁定方法放在IsPostBack條件,但不幫忙。 –

1

您可以在使用Response.Redirect的代碼隱藏,並從你的LinkBut​​ton的刪除一項PostBackUrl

<asp:DataList ID="dlstResults" runat="server" CellPadding="4" OnItemCommand="dlstResults_ItemCommand" 
    ForeColor="#333333" Width="100%" OnItemDataBound="dlstResults_ItemDataBound"> 
    <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
    <SelectedItemStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /> 
    <AlternatingItemStyle BackColor="White" ForeColor="#284775" /> 
    <ItemStyle BackColor="#F7F6F3" ForeColor="#333333" /> 
    <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
    <ItemTemplate> 
     <asp:LinkButton ID="lnkResultUrl" runat="server" CommandArgument='<%# Eval("Url") %>' 
      CommandName="SomeName" Text='<%# Eval("Title") %>' /> 
     <br /> 
     <asp:Label ID="lblResultUrl" runat="server" Font-Bold="true" Text='<%# Eval("Url") %>' /> 
     <br /> 
     <asp:Label ID="lblResultSummay" runat="server" Text="desc" /> 
    </ItemTemplate> 
</asp:DataList> 

和代碼隱藏

protected void dlstResults_ItemCommand(Object sender, DataListCommandEventArgs e) 
{ 
    if (e.CommandName == "SomeName") 
    { 
     string url = e.CommandArgument.ToString(); 
     //do some stuff with url before you redirect 
     Response.Redirect("//" + url); 
    } 
} 
+0

好的嘗試!不幸的是,獲取鏈接按鈕以在DataList或GridView行中引發OnClick事件不起作用。這種反直覺,我知道:) –

+0

哦..不知道,rowcommand/itemcommand是正確的方式就像在你的答案,但postbackurl + itemcommand一起工作?只是好奇:) – Emre

+0

啊,你很快抓到了postbackurl!我昨天忽略了這個評論。 +1 –