ASP.NET Repeater:项目模板中的按钮,重定向到另一个页面

时间:2012-03-08 10:04:45

标签: c# asp.net repeater

我有一个转发器,每个项目都包含一个按钮,该按钮应该重定向到另一个页面,并在查询字符串中传递一个值。

我没有收到任何错误,但是当我点击按钮时,页面只会刷新(因此我假设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事件处理程序,但没有输入ItemCommand

3 个答案:

答案 0 :(得分:1)

想在你需要添加的转发器上

OnItemDataBound =“MySponsoredChildrenList_ItemDataBound”

不是100%肯定,但对于ItemCommand可能是相同的。

-

关于获得ChildID。将CommandArgument添加到转发器中的按钮,并以相同的方式设置<% Eval("ChildID") %>。这可以使用e.CommandArgument获得。

答案 1 :(得分:1)

您需要将MySponsoredChildrenList_ItemDataBound设置为受保护。现在,你只是'void',默认情况下是私有的,前面的aspx页面无法访问。

另一种方法是使用+ =运算符在代码后面的函数中使用add事件处理程序语法。

无论哪种方式,现在都会遇到断点,我们的代码应该工作。

编辑:所以上面解决了编译错误,但没有点击断点;我已经进行了一些测试,并能够点击这样的断点:

由于我不知道你是如何进行数据绑定的,我只是将这段代码添加到我的代码隐藏中:

    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);
            }
        }

    }

希望这会有所帮助 - 如果没有,请发布有关正在发生的事情的“全貌”的其他代码,以便我们可以看到您可能遇到问题的其他地方。

答案 2 :(得分: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>