5

我有一个Repeater包含标记为“更改成员资格”的链接,单击该链接会打开一个带有 aradiobuttonlist和 a的灯箱button。当点击灯箱中的按钮时,我有一个回调事件,我需要首先找到单选按钮列表的选定值,这里是中继器:

  <script language="JavaScript" type="text/javascript">
    function CreateBox(id) {
    $(document).ready(function () {
        $("#lnk" + id).fancybox({
            'closeBtn': true,
            helpers: {
                overlay: { closeClick: false }
            }
        });
    });
 }
</script>

身体

   <asp:Repeater ID="repProspects" runat="server" OnItemDataBound="repProspects_ItemDataBound">
    <ItemTemplate>
        <asp:HiddenField ID="hfRequestID" runat="server" Value='<%# DataBinder.Eval(Container, "DataItem.RequestID") %>' />
        <asp:HiddenField ID="hfRecruiterNumber" runat="server" Value='<%# DataBinder.Eval(Container, "DataItem.RecruiterCardNumber") %>' />
        <asp:HiddenField ID="hfCompanyID" runat="server" Value='<%# DataBinder.Eval(Container, "DataItem.CompanyID") %>' />
        <asp:HiddenField ID="hfMemberType" runat="server" Value='<%# DataBinder.Eval(Container, "DataItem.MemberType") %>' />
        <asp:HiddenField ID="hfLifeDuesAmount" runat="server" Value='<%# DataBinder.Eval(Container, "DataItem.Dues") %>' />
        <asp:HiddenField ID="hfDerivedAnnualDues" runat="server" />
        <asp:HiddenField ID="hfDerivedInstallments" runat="server" />
        <asp:HiddenField ID="hfRblSelectedValue" runat="server" />
        <asp:HiddenField ID="hfSetMemberType" ClientIDMode="Static" runat="server" />
        <asp:HiddenField ID="hfState" runat="server" Value='<%# DataBinder.Eval(Container, "DataItem.HomeState") %>' />
        <asp:HiddenField ID="hfCountry" runat="server" Value='<%# DataBinder.Eval(Container, "DataItem.HomeCountry") %>' />
        <asp:HiddenField ID="hfBirthday" runat="server" Value='<%# DataBinder.Eval(Container, "DataItem.Birthday") %>' />
        <div id='h<%# DataBinder.Eval(Container, "DataItem.ID") %>' class="header" onclick='ToggleDisplay(<%# DataBinder.Eval(Container, "DataItem.ID") %>);'>
            <img id="img<%# DataBinder.Eval(Container, "DataItem.ID") %>" alt="" src="../images/plusIconSmaller.png" />
            <%# DataBinder.Eval(Container, "DataItem.FirstName")%>
            <% if (DataBinder.GetDataItem("DataItem.MiddleName") != "")
               { %>
            <%# DataBinder.Eval(Container, "DataItem.MiddleName")%>
            <% } %>
            <%# DataBinder.Eval(Container, "DataItem.LastName")%>
            <% if (DataBinder.GetDataItem("DataItem.Suffix") != "")
               { %>
            <%# DataBinder.Eval(Container, "DataItem.Suffix")%>
            <% } %>
            (<%# DataBinder.Eval(Container, "DataItem.CurrentStatus")%>, <%# DataBinder.Eval(Container, "DataItem.BranchOfService")%>)&nbsp;&nbsp;
            <asp:Label ID="lblRecruitedBy" runat="server"></asp:Label>
            <%# Convert.ToDateTime(DataBinder.Eval(Container, "DataItem.DateCreated")).ToShortDateString()%>
        </div>
        <div id='reqid<%# DataBinder.Eval(Container, "DataItem.RequestID") %>'></div>
        <div id='d<%# DataBinder.Eval(Container, "DataItem.ID") %>' class="details">
            <table width="100%">
                <tr>
                    <td valign="top" width="25%"><u><b>Address</b></u><br />
                        <%# DataBinder.Eval(Container, "DataItem.HomeAddressLine1")%><br />
                        <%# DataBinder.Eval(Container, "DataItem.HomeCity")%>, <%# DataBinder.Eval(Container, "DataItem.HomeState")%>&nbsp;<%# DataBinder.Eval(Container, "DataItem.HomeZipCode")%><br />
                        <%# DataBinder.Eval(Container, "DataItem.HomeCountry")%></td>
                    <td valign="top" width="20%"><u><b>Qualifying Service</b></u><br />
                        <asp:Label ID="lblServiceInfo" runat="server"></asp:Label></td>
                    <td valign="top" width="20%"><u><b>Contact Info</b></u><br />
                        <% if (DataBinder.GetDataItem("DataItem.Phone") != "")
                           { %>
                        <%# FormatPhone(DataBinder.Eval(Container, "DataItem.Phone").ToString()) %>
                        <% } %>
                        <asp:Label ID="lblMemberPhone" runat="server"></asp:Label>
                        <%# DataBinder.Eval(Container, "DataItem.Email")%><br />
                         Birthday:  <%# Convert.ToDateTime(DataBinder.Eval(Container, "DataItem.Birthday")).ToShortDateString()%></td>
                    <td valign="top" width="20%"><u><b>Membership</b></u><br />
                        <%# DataBinder.Eval(Container, "DataItem.MemberType")%><br />
                        $<asp:Label ID="lblDuesAmount" runat="server"></asp:Label>
                        <br />

                        <a href='#ChgMemType<%# DataBinder.Eval(Container, "DataItem.ID") %>'  onclick='CreateBox(<%# DataBinder.Eval(Container, "DataItem.ID") %>);' id='lnk<%# DataBinder.Eval(Container, "DataItem.ID") %>' >Change Membership</a>


                    </td>
                    <td valign="top" align="center">
                        <asp:Button ID="lnkApprove" Style="border: 1px solid black; border-radius: 7px; padding: 5px; cursor: pointer; background-color: #990000; width: 130px; color: white; font-weight: bold" Text="Approve & Pay" runat="server" CommandArgument='<%# DataBinder.Eval(Container, "DataItem.ID") %>' OnClientClick="return confirm('Are you sure you want to approve this member application?');" OnCommand="lnkApprove_Click"></asp:Button><br />
                        <br />
                        <asp:Button ID="lnkReject" Style="border: 1px solid black; border-radius: 7px; padding: 5px; cursor: pointer; background-color: #990000; width: 130px; color: white; font-weight: bold" Text="Reject" runat="server" CommandArgument='<%# DataBinder.Eval(Container, "DataItem.ID") %>' OnClientClick="return confirm('Are you sure you want to reject this member applictation?');" OnCommand="lnkReject_Click"></asp:Button></td>
                </tr>
            </table>
        </div>

            <div id='ChgMemType<%# DataBinder.Eval(Container, "DataItem.ID") %>' style="display: none; width:400px; text-align: left">
                <h3>Change Membership Type </h3>
                <p>Please select the membership type below:</p>
                <input id='hfChangedMemberType' value="<%# DataBinder.Eval(Container, "DataItem.ID") %>" type="hidden" />

                <div id="RadioDiv">
                   <asp:RadioButtonList ID="_rblMemberTypes" runat="server">
                        <asp:ListItem Text="Annual" Value="Annual">Annual</asp:ListItem>
                        <asp:ListItem Text="Life" Value="Life">Life</asp:ListItem>
                        <asp:ListItem Text="Installment" Value="Installment">Installment</asp:ListItem>
                    </asp:RadioButtonList>
                </div>

                <asp:LinkButton ID="lbSetMemType" EnableViewState="true" CommandArgument='<%# DataBinder.Eval(Container, "DataItem.RequestID") %>' OnCommand="lbSetMemType_Command" CssClass="button" runat="server">Save</asp:LinkButton>
        </div>
    </ItemTemplate>
</asp:Repeater>

接下来是单击“保存”按钮时事件背后的代码:

        protected void lbSetMemType_Command(object sender, CommandEventArgs e)
    {
        decimal dDuesAmount = 0;
        bool bSuccess = false;
        int iRequestID = Convert.ToInt32(e.CommandArgument);
        string sMemType = "";
        HiddenField hfDerivedAnnualDues;
        HiddenField hfDerivedInstallments;
        HiddenField hfLifeDuesAmount;
        HiddenField hfSetMemberType;

            foreach (RepeaterItem item in repProspects.Items)
            {
                // Checking the item is a data item
                if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
                {
                    var reqid = item.FindControl("hfRequestID") as HiddenField;

                    if (Convert.ToInt32(reqid.Value) == iRequestID) { 
                        var rdbList = item.FindControl("_rblMemberTypes") as RadioButtonList;
                        if (rdbList != null)
                        {
                            foreach (ListItem li in rdbList.Items)
                            {
                                if (li.Selected == true)
                                {
                                    sMemType = li.Text;
                                }
                            }
                        }
                        // Get the selected value

                        hfSetMemberType = item.FindControl("hfRblSelectedValue") as HiddenField;
                        sMemType = rdbList.SelectedValue;
                        // sMemType = hfSetMemberType.Value;
                        hfDerivedAnnualDues = item.FindControl("hfDerivedAnnualDues") as HiddenField;
                        hfDerivedInstallments = item.FindControl("hfDerivedInstallments") as HiddenField;
                        hfLifeDuesAmount = item.FindControl("hfLifeDuesAmount") as HiddenField;
                    }


                }
            }


            switch (sMemType)
                {
                    case "Annual":
                    {
                            //dDuesAmount = Convert.ToDecimal(hfDerivedAnnualDues.Value);
                            break;
                    }
                    case "Life":
                    {
                        //dDuesAmount = Convert.ToDecimal(hfLifeDuesAmount.Value);
                        break;
                    }
                    case "Installments":
                    {
                       // dDuesAmount = Convert.ToDecimal(hfDerivedInstallments.Value);
                        break;
                    }
                    default:
                    {
                        //dDuesAmount = Convert.ToDecimal(hfDerivedAnnualDues.Value);
                        break;
                    }
                }

        bSuccess = logicManager.UpdateNewMemberAppMemType(iRequestID, sMemType, dDuesAmount);
        }

我可以设置断点,并且可以看到隐藏字段中的值是正确的,但是我无法在此语句中获得正确的单击值:

sMemType = rdbList.SelectedValue;

我得到了初始值,但没有得到用户点击的值?

4

1 回答 1

1

首先,您的实际代码中缺少OnItemCommand="lbSetMemType_Command"。此外,手动迭代中继器会给您带来较差的性能结果,特别是如果您正在寻找单选按钮的值。

现在,让我们一起做一个MCVE示例。根据您的代码,您正在尝试在 aRadioButtonList内部构建一个Repeater,其中包含一个LinkButton使用单选按钮值的人。在我们的例子中,让我们在标签中打印所述选择按钮的值,证明我们的例子。

MCVE.aspx

<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
   <asp:Repeater ID="rptTest" runat="server" OnItemCommand="rptTest_ItemCommand">
<ItemTemplate>
     <asp:RadioButtonList ID="rdlTest" runat="server">
                        <asp:ListItem Text="Annual" Value="Annual"></asp:ListItem>
                        <asp:ListItem Text="Life" Value="Life"></asp:ListItem>
                        <asp:ListItem Text="Installment" Value="Installment"></asp:ListItem>
                    </asp:RadioButtonList>
    <asp:LinkButton runat="server" ID="lbValidationTest" OnClick="lbValidationTest_Click" runat="server" >Fetch Value</asp:LinkButton>
</ItemTemplate>
   </asp:Repeater>
    <asp:Label runat="server" ID="lblViewResult"></asp:Label>
</asp:Content>

当您在 VS 上创建新项目时,我使用的是默认母版页。这里真的无所谓

和代码隐藏

MCVE.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication
{
    public partial class MCVE: Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        if (!Page.IsPostBack)
            {
                List<int> uselessData = new List<int>(new int[] { 1, 2 });
                this.rptTest.DataSource = uselessData;
                this.rptTest.DataBind();
            }
        }    
        protected void rptTest_ItemCommand(object source, RepeaterCommandEventArgs e)
        {
            RadioButtonList list = (RadioButtonList)e.Item.FindControl("rdlTest");
            this.lblViewResult.Text = list.SelectedValue;
        }
    }
}

经过一些尝试,我们清楚地看到这没有按预期工作。实际上,在禁止我们这样做之间存在一些已知问题。RepeaterRadioButtonList

那么,现在该怎么办?我们有很多解决方案,例如我们可以使用 javascript 在隐藏字段中获取和设置我们的值;我们可以遍历整个中继器树并检查每个按钮,甚至可以使用CommandArgument来定位RadioButtonList的索引并在代码隐藏中获取它。

让我们实现javascript解决方案。我们将把索引的值注入到中继器中的隐藏字段中。我认为最好处理客户端而不是服务器端的这种行为,但我可能会弄错并且希望对此有一些输出。

所以让我们在视图中添加一个非常脏的 javascript 代码

MCVE.aspx 新版本

<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
   <asp:Repeater ID="rptTest" runat="server" OnItemCommand="rptTest_ItemCommand">
<ItemTemplate>
    <div>
    <asp:HiddenField runat="server" ID="hfSelectedValue" />
     <asp:RadioButtonList ID="rdlTest" runat="server" >
                        <asp:ListItem Text="Annual" Value="Annual" onclick="QuickAndDirtyHiddenSetDontUseItInProd(this)"></asp:ListItem>
                        <asp:ListItem Text="Life" Value="Life" onclick="QuickAndDirtyHiddenSetDontUseItInProd(this)"></asp:ListItem>
                        <asp:ListItem Text="Installment" Value="Installment" onclick="QuickAndDirtyHiddenSetDontUseItInProd(this)"></asp:ListItem>
                    </asp:RadioButtonList>
    <asp:LinkButton runat="server" ID="lbValidationTest"  runat="server" UserSubmitBehavior="true" >Fetch Value</asp:LinkButton>
        </div>
</ItemTemplate>
   </asp:Repeater>
    <asp:Label runat="server" ID="lblViewResult"></asp:Label>
    <script>
        function QuickAndDirtyHiddenSetDontUseItInProd(data) {
            $(data).parent().parent().parent().parent().siblings("input[name*=hfSelectedValue]").val(data.value);
        }
    </script>
</asp:Content>

我们只改变了 3 件事。我们将为我们要创建的每个单选按钮列表跟踪一个隐藏字段,我们添加了一个脚本来更改所述隐藏字段的值并将两者与 onclic 链接。

现在,在我们的代码隐藏中,我们只需要跟踪通过单击 ButtonLink 分组的隐藏字段(即,在同一 ButtonLink 中RepeaterItem),我们就可以开始了。

MCVE.aspx.cs 新版本

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication
{
    public partial class MCVE: Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                List<int> uselessData = new List<int>(new int[] { 1, 2 });
                this.rptTest.DataSource = uselessData;
                this.rptTest.DataBind();
            }
        }

        protected void rptTest_ItemCommand(object source, RepeaterCommandEventArgs e)
        {
            HiddenField hiddenField = (HiddenField)e.Item.FindControl("hfSelectedValue");
            this.lblViewResult.Text = hiddenField.Value;
        }

    }
}

不言自明,我们只是在中继器中找到隐藏字段,然后使用它来填充标签。

于 2016-06-20T13:45:03.230 回答