ASP.NET中继器:项模板中用于重定向到另一页的按钮

本文关键字:重定向 一页 按钮 用于 中继器 NET ASP | 更新日期: 2023-09-27 18:27:11

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

我没有收到任何错误,但当我单击按钮时,页面会刷新(因此我假设确实发生了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?

EDIT:使用断点;ItemDatabound事件处理程序被击中,但ItemCommand根本没有被输入

ASP.NET中继器:项模板中用于重定向到另一页的按钮

您需要将MySSponsoredChildrenList_ItemDataBound设置为受保护。现在,您只有"void",默认情况下它是私有的,不能访问aspx首页。

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

无论哪种方式,断点现在都会被命中,我们的代码应该可以工作了。

EDIT:所以上面解决了编译错误,但断点没有被击中;我已经运行了一些测试,并且能够达到如下断点:

由于我不知道你是如何进行数据绑定的,我只是在我的代码后面添加了以下代码:

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

注意:如果每次回发都调用DataBind()和ItemDataBound(),它将清除命令参数,这可能就是您所看到的;因此,如果您总是看到[object]_ItemDataBound()断点命中,但从未看到[object]_ItemCommand()断点,那是因为您只需要在初始页面加载时或进行任何重大更改后进行数据绑定。

还请注意MySSponsoredChildrenList_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时,您需要转换为正确的控件类型,并确保在转换之前检查空值和null值,否则您可能会出现错误:

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

希望这能有所帮助——如果没有,请发布额外的代码,了解正在发生的事情的"全貌",这样我们就可以看到你可能有问题的其他地方。

I认为在中继器上需要添加

OnItemDataBound="MySponsoredChildrenList_ItemDataBound"

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

--

关于获得儿童身份证。在中继器中的按钮上添加一个CommandArgument,并以相同的方式设置<% Eval("ChildID") %>。这可以使用CCD_ 5来获得。

试试这个。。将属性添加到项目行

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>