2012-03-08 73 views
0

我有一箇中繼器,並且每個項目都包含一個按鈕,應該重定向到另一頁,並且還通過在查詢字符串的值。ASP.NET直放站:巴頓在項模板重定向到另一個頁面

我沒有收到任何錯誤,但是當我點擊按鈕時,頁面只是刷新(所以我假設postback發生)並且不重定向。我認爲出於某種原因,它不認可按鈕的CommandName

直放站代碼:


<asp:Repeater ID="MySponsoredChildrenList" runat="server" OnItemDataBound="MySponsoredChildrenList_ItemDataBound" OnItemCommand="MySponsoredChildrenList_ItemCommand"> 
    <HeaderTemplate> 
    </HeaderTemplate> 
    <ItemTemplate> 
     <br /> 
     <div id="OuterDiv"> 
      <div id="InnerLeft"> 
       <asp:Image ID="ProfilePic" runat="server" ImageUrl='<%#"~/Resources/Children Images/" + String.Format("{0}", Eval("Primary_Image")) %>' 
        Width='300px' Style="max-height: 500px" /></div> 
      <div id="InnerRight"> 
      <asp:HiddenField ID="ChildID" runat="server" Value='<%# DataBinder.Eval(Container.DataItem, "Child_ID") %>'/> 
        <span style="font-size: 20px; font-weight:bold;"><%# DataBinder.Eval(Container.DataItem, "Name") %> 
        <%# DataBinder.Eval(Container.DataItem, "Surname") %></span> 
       <br /><br /><br /> 

       What have you been up to? 
       <br /><br /> 
        <span style="font-style:italic">"<%# DataBinder.Eval(Container.DataItem, "MostRecentUpdate")%>"</span>  

        <span style="font-weight:bold"> -<%# DataBinder.Eval(Container.DataItem, "Update_Date", "{0:dd/MM/yyyy}")%></span><br /><br /><br />Sponsored till: 

       <%# DataBinder.Eval(Container.DataItem, "End_Date", "{0:dd/MM/yyyy}")%> 
       <br /><br /> 

       <asp:Button ID="ChildProfileButton" runat="server" Text="View Profile" CommandName="ViewProfile" /> 
      </div> 
     </div> 
     <br /> 
    </ItemTemplate> 
    <SeparatorTemplate> 
     <div id="SeparatorDiv"> 
     </div> 
    </SeparatorTemplate> 
</asp:Repeater> 

C#代碼隱藏:


protected void MySponsoredChildrenList_ItemDataBound(object sender, RepeaterItemEventArgs e) 
     { 
      if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item) 
      { 
       // Stuff to databind 
       Button myButton = (Button)e.Item.FindControl("ChildProfileButton"); 

       myButton.CommandName = "ViewProfile";    } 
     } 

     protected void MySponsoredChildrenList_ItemCommand(object source, RepeaterCommandEventArgs e) 
     { 
      if (e.CommandName == "ViewProfile") 
      { 
       int ChildIDQuery = Convert.ToInt32(e.Item.FindControl("ChildID")); 
       Response.Redirect("~/ChildDescription.aspx?ID=" + ChildIDQuery); 
      } 

     } 

我是新來使用中繼所以它可能只是一個新手的錯誤。在旁註:有沒有更好的方式獲得ChildID而不使用隱藏字段?

編輯:使用斷點; ItemDataBound事件處理程序被擊中,但在所有

+0

您是否在事件處理程序的開始處放置了斷點?它受到打擊嗎? 「e.CommandName」評估的是什麼? – Oded 2012-03-08 10:08:09

+0

單擊時是否出現任何錯誤。 – joshua 2012-03-08 10:09:28

+0

剛剛嘗試過,事件處理程序似乎沒有被調用。當我加載頁面時,將onClick屬性添加到任一事件的按鈕都會導致錯誤。 @Black_Crown:單擊時沒有錯誤,頁面似乎回發並刷新 – Matt 2012-03-08 10:12:55

回答

1

您需要設置MySponsoredChildrenList_ItemDataBound的保護。現在,你只是'無效',默認情況下是私人的,並且無法訪問前面的aspx頁面。

另一種方式是在代碼中使用添加事件處理程序語法從函數後面,使用+ =運算符。

無論哪種方式,斷點現在將打我們的代碼應該mwork。

編輯:所以上面解決了編譯錯誤,但斷點沒有被擊中;我已經跑了一些測試,我能夠打斷點像這樣:

因爲我不知道你是如何數據綁定,我只是說此代碼到我的代碼隱藏:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      MySponsoredChildrenList.DataSource = new List<object>() { null }; 
      MySponsoredChildrenList.DataBind(); 
     } 
    } 

注意:如果每次回發都調用DataBind()和ItemDataBound(),它將清除命令參數,這可能是您看到的;所以如果你總是看到[object] _ItemDataBound()斷點,但從來沒有[object] _ItemCommand(),這是因爲你只需要在初始頁面加載時或者在做出任何重大更改之後才需要數據綁定。

還要注意方法MySponsoredChildrenList_ItemCommand不起作用:

protected void MySponsoredChildrenList_ItemCommand(object source, RepeaterCommandEventArgs e) 
    { 
     if (e.CommandName == "ViewProfile") 
     { 
      int ChildIDQuery = Convert.ToInt32(e.Item.FindControl("ChildID")); 
      Response.Redirect("~/ChildDescription.aspx?ID=" + ChildIDQuery); 
     } 

    } 

當你這樣做的FindControl,你需要轉換爲正確的控制類型,並且確保在轉換之前檢查空和空值,否則你可能會有錯誤:

protected void MySponsoredChildrenList_ItemCommand(object source, RepeaterCommandEventArgs e) 
    { 
     if (e.CommandName == "ViewProfile") 
     { 
      int childId = 0; 
      var hiddenField = e.Item.FindControl("ChildID") as HiddenField; 
      if (null != hiddenField) 
      { 
       if (!string.IsNullOrEmpty(hiddenField.Value)) 
       { 
        childId = Convert.ToInt32(hiddenField.Value); 
       } 
      } 

      if (childId > 0) 
      { 
       Response.Redirect("~/ChildDescription.aspx?ID=" + childId); 
      } 
     } 

    } 

希望這有助於 - 如果不是,請張貼正在發生的事情的「全貌」額外的代碼,所以我們可以看到什麼地方,你可能有問題。

+0

這解決了編譯錯誤,但斷點仍然沒有被擊中:/感謝您的幫助到目前爲止+1解決編譯錯誤 編輯:itemDataBound被擊中,但itemCommand不是 – Matt 2012-03-08 11:01:23

+0

您尚未發佈DataBind()中繼器的代碼;我剛把這個傳遞給我自己的應用程序,並添加了一些代碼綁定到一個虛擬物體上,並且它可以工作。此外,您在MySponsorsChildrenList_ItemCommand方法中也有錯誤。 – 2012-03-08 11:11:14

+0

查看我的擴展答案,它解釋了爲什麼ItemDataBound總是被命中並且ItemComment沒有被命中 - 你很可能會在每個回發中綁定數據,並且刪除命令參數。嘗試數據綁定僅在初始頁面加載(請參閱我的編輯瞭解詳情)。 – 2012-03-08 11:21:43

1

未進入ItemCommand我認爲你需要添加中繼

OnItemDataBound =「MySponsoredChildrenList_ItemDataBound」

不是100%肯定,但對於ItemCommand可以是相同的。

-

在問候獲得childID的。添加CommandArgument到中繼器按鈕,並設置它以同樣的方式,<% Eval("ChildID") %>。這可以使用e.CommandArgument獲得。

+0

剛剛試過這個,但它給了我一個編譯錯誤(請參閱編輯問題) – Matt 2012-03-08 10:24:55

+1

可能聽起來很明顯,但是當您說「後面的代碼」時,您的意思是mysponsoredchildren.aspx.cs文件,而不是App_Code文件夾中的類文件?不應該有任何區別,但在您的示例中,該ItemDataBound只是無效的,不受保護。只是釣魚的東西檢查在這裏.... :) – ianbailey 2012-03-08 10:42:29

+0

我改變它保護,並解決了編譯錯誤,我得到,但仍然只是做回發和刷新頁面:/感謝您的幫助到目前爲止 – Matt 2012-03-08 11:00:18

0

試試這個..屬性添加到項目排

row.Attributes["onclick"] = string.Format("window.location = '{0}';", ResolveClientUrl(string.Format("~/YourPage.aspx?userId={0}", e.Item.DataItem))); 

,或者你可以這樣做也

<ItemTemplate>  <tr onmouseover="window.document.title = '<%# Eval("userId", "Click to navigate onto user {0} details page.") %>'"   onclick='window.location = "<%# ResolveClientUrl("~/YourPage.aspx?userId=" + Eval("userid")) %>"'>   <td>    <%# Eval("UserId") %>   </td>  </tr> </ItemTemplate> 
+0

我到底在哪裏呢?我很抱歉,但我對asp一般很陌生,感謝您的幫助。 – Matt 2012-03-08 10:34:57

相關問題