我需要在javascript函数中访问按钮的ValidationGroup值。 该按钮是嵌套网格的一部分。我在RowDataBound事件期间为按钮和Dropdown控件设置ValidationGroup值。如下所示:
protected void UserGroupGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
try
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
int tiGroupID = Convert.ToInt32(UserGroupGridView.DataKeys[e.Row.RowIndex].Value.ToString());
m_strUserID = CommonMethods.ParseUserID(User.Identity.Name);
GridView tgvGroupMember = (GridView)e.Row.FindControl("GroupMemberGridView");
populateGroupMemberGrid(tgvGroupMember, tiGroupID);
//Get the Footer controls that have the new entry data
Control tFooterControls = CommonMethods.getFooterControls(tgvGroupMember);
DropDownList tddlRecipientNames = tFooterControls.FindControl("mggvDDLMemberName") as DropDownList;
m_strXmlTableData = m_pagingClient.GetAllPossibleGroupMembers(m_strUserID, tiGroupID);
DataTable tdtAllGroupMembers = CommonMethods.ParseXML(m_strXmlTableData);
tddlRecipientNames.DataSource = tdtAllGroupMembers;
tddlRecipientNames.DataTextField = tdtAllGroupMembers.Columns["MemberName"].ToString();
tddlRecipientNames.DataValueField = tdtAllGroupMembers.Columns["MemberID"].ToString();
tddlRecipientNames.DataBind();
tddlRecipientNames.Items.Insert(0, new ListItem("", "0"));//This is needed for the jquery-chosen dropdown to add data-holder text
tddlRecipientNames.ValidationGroup = "DDLVal_" + tiGroupID.ToString();
Button tbtnAdd = tFooterControls.FindControl("mggvAddButton") as Button;
tbtnAdd.ValidationGroup = "DDLVal_" + tiGroupID.ToString();
}
}
catch (Exception ex)
{
//TO DO: Response.Redirect("~/Error.aspx");
}
}
这是Dropdown和Button的标记:
<asp:DropDownList ID="mggvDDLMemberName" runat="server" ClientIDMode="Static" class="chosen-single" data-placeholder="Choose member…">
</asp:DropDownList>
<asp:RequiredFieldValidator ID="ReqValueDDLMemberInsert" runat="server" InitialValue="0" ControlToValidate="mggvDDLMemberName" ErrorMessage="Selection required." CssClass="message-error-dropdown">
</asp:RequiredFieldValidator>
<asp:Button ID="mggvAddButton" runat="server" CommandName="Add" Text="Add Member" Width="90%" ClientIDMode="Static" CssClass="gridActionbutton" CausesValidation="true" OnClientClick="return Validate(this);" >
</asp:Button>
单击该按钮时,我调用客户端函数Validate(this)。 这是Validate函数:
function Validate(ClientID) {
valgroup = ClientID.Validators[0].validationGroup;
//THIS IS THE PROBLEM. valgroup is null?
alert(valgroup);
if (Page_ClientValidate(valgroup)) {
// alert('it is valid');
return true;
}
else {
// alert('No valid');
return false;
}
如何访问按钮的ValidationGroup属性?
更新 玩弄不同的jquery方法,这就是我发现的...... 我可以使用这个获取发送按钮的ID:
function Validate(ClientID)
{
var val = $(ClientID).attr('id');
alert(val); //this returns the id of the button (mggvAddButton)
//This returns the DropDown list id, entries, etc.
//This dropdown is beside the button.
var val = $(ClientID).parent().parent().html();
alert(val);
//When I try to get the id of the dropdown, I get 'undefined.
var val = $(ClientID).parent().parent().attr('id');
alert(val);
}
为什么不能找到下拉列表的ID?它在html中!
更新
添加整个嵌套网格以更好地解释我需要做什么......
<div id="div<%# Eval("GroupID") %>" style="display:none">
<asp:GridView ID="GroupMemberGridView" runat="server" AutoGenerateColumns="false" OnRowDeleting="GroupMemberGridView_RowDeleting"
OnRowCommand="GroupMemberGridView_RowCommand" CssClass="grid" ShowFooter="true">
<Columns>
<asp:TemplateField HeaderText="MemberID">
<ItemTemplate>
<asp:Label ID="mggvLblMemberID" runat="server" Text='<%# Bind("MemberID") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Member Name" ItemStyle-Wrap="false">
<ItemTemplate>
<asp:Label ID="mggvLblMemberName" runat="server" Text='<%# Bind("MemberName") %>'></asp:Label>
</ItemTemplate>
<FooterTemplate>
<asp:DropDownList ID="mggvDDLMemberName" runat="server" ClientIDMode="Static" class="chosen-single" data-placeholder="Choose member…">
</asp:DropDownList>
<asp:RequiredFieldValidator ID="ReqValueDDLMemberInsert" runat="server" InitialValue="0" ControlToValidate="mggvDDLMemberName" ValidationGroup="InsertMemberValidation" ErrorMessage="Selection required." CssClass="message-error-dropdown">
</asp:RequiredFieldValidator>
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Active Device(s)">
<ItemTemplate>
<asp:Label ID="mggvLblActiveDevice" runat="server" Text='<%# (Boolean.Parse(Eval("ActiveDevice").ToString())) ? "Yes" : "No" %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Action" ItemStyle-Wrap="false" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:Button ID="mggvDeleteButton" runat="server" CausesValidation="False" CommandName="Delete" Text="Delete" CssClass="gridActionbutton" OnClientClick="return confirm('Are you sure you want to delete this Group Member?')" >
</asp:Button>
</ItemTemplate>
<FooterTemplate>
<asp:Button ID="mggvAddButton" runat="server" CommandName="Add" Text="Add Member" Width="90%" ClientIDMode="Static" CssClass="gridActionbutton" CausesValidation="true" ValidationGroup="InsertMemberValidation" OnClientClick="return Validate(this);" >
</asp:Button>
</FooterTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
更新
经过一些调试,我了解到第一个嵌套网格及其所有控件都可以轻松访问。但是,第二个嵌套网格没有设置控件ID。
javascript函数:
function Validate(sender)
{
var e = document.getElementById("mggvDDLMemberName");
var strSel = "The Value is: " + e.options[e.selectedIndex].value + " and text is: " + e.options[e.selectedIndex].text;
alert(strSel);
}
当我点击第一个嵌套网格的“添加”按钮并在下拉列表中选择一个值时,上面的javascript函数会正确显示数据。
当我点击SECOND嵌套网格的“添加”按钮并在“下拉列表”中选择一个值时。上面的javascript函数将Value显示为0,文本为空。
但是,在两种情况下,成员都已成功添加到组中,并在单击“添加”按钮后显示在列表中。
因此,无论单击哪个“添加”按钮,只显示此javascript函数中的第一个嵌套网格数据。但是在代码隐藏中,Add事件可以正确地确定将成员添加到哪个嵌套网格。
这是GroupMember(嵌套网格)添加行命令:
protected void GroupMemberGridView_RowCommand(object sender, GridViewCommandEventArgs e)
{
try
{
if (e.CommandName.Equals("Add"))
{
//Get the Footer controls that have the new entry data
GridView tgvGroupMember = (GridView)sender;
Control tFooterControls = CommonMethods.getFooterControls(tgvGroupMember);
int tiMemberID = Convert.ToInt32((tFooterControls.FindControl("mggvDDLMemberName") as DropDownList).SelectedItem.Value);
int tiGroupID = Convert.ToInt32((tgvGroupMember.Parent.FindControl("uggvLblGroupID") as Label).Text);
//Insert into the database
m_pagingClient.InsertGroupMember(tiGroupID, tiMemberID);
//Rebind the grid with the new data
populateGroupGrid();
}
}
catch (Exception ex)
{
//TO DO: Response.Redirect("~/Error.aspx");
}
}
上述方法确定哪个会员网格触发了该事件并从那里开始。
我需要在javascript函数的客户端执行同样的操作来验证DDL条目。