我在Gridview中有一个必需的字段验证器。我只想在ddlPartsStatus是" Ordered"时才开火验证器。我无法让它发挥作用。
此时所需的字段验证程序将触发所有文本框。
我的代码
<asp:GridView ID="gvPartsToOrderDetail" CssClass="gvPartsToOrderDetail" runat="server" AutoGenerateColumns="false" OnRowDataBound="gvPartsToOrderDetail_RowDataBound">
<Columns>
<asp:TemplateField HeaderText="Ticket Number">
<ItemTemplate>
<asp:TextBox ID="txtTicketNo" Text='<%# Eval("TicketNo") %>' runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="rfvTxtTicketNo" runat="server" ForeColor="Red" Font-Bold="true" Font-Size="Medium" ErrorMessage="*" ControlToValidate="txtTicketNo" ValidationGroup="Submit"></asp:RequiredFieldValidator>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Parts Status">
<ItemTemplate>
<asp:DropDownList ID="ddlPartStatus" runat="server" AutoPostBack="true">
<asp:ListItem Value="0" Text="-Select-"></asp:ListItem>
<asp:ListItem Value="1" Text="Ordered"></asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:Button ID="btnSubmit" CssClass="btnSubmit" runat="server" Text="Submit" ValidationGroup="Submit" OnClick="btnSubmit_Click" />
非常感谢任何帮助。感谢
答案 0 :(得分:2)
为此你需要一个CustomValidator
。然后ClientValidationFunction
应该同时评估TextBox和DropDownList。
<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="*"
ValidationGroup="Submit" ControlToValidate="txtTicketNo"
ClientValidationFunction="checkValuesInRow" ValidateEmptyText="true"></asp:CustomValidator>
<script type="text/javascript">
function checkValuesInRow(sender, element) {
var isValid = false;
var ddlValue = $("#" + sender.controltovalidate).closest('tr').find('select').val();
if (element.Value === "" && ddlValue === "0") {
isValid = true;
}
element.IsValid = isValid;
}
</script>
答案 1 :(得分:1)
注意:如果必须进行所有点击,进一步阅读旨在提供信息并且不实用。但是它显示了可以完成的事情,不一定是应该如何完成的事情,而且仅仅是因为OP要求更多信息......所以,我们走了
鉴于此GridView q = 0; while [ q < 9 ]; q ++; do echo q; done
:
<ItemTemplate>
根据您的行数,使用 x 数量的验证器呈现表格。您可以使用浏览器的开发人员工具检查 <asp:TextBox ID="tbxTicketNo" runat="server" Text='<%# Bind("TicketNo") %>'></asp:TextBox>
<asp:RequiredFieldValidator ID="rfvTxtTicketNo" runat="server"
ErrorMessage="RequiredFieldValidator" Text="*"
ControlToValidate="tbxTicketNo"
InitialValue="0"
ValidationGroup="vgSubmit">
</asp:RequiredFieldValidator>
,在那里您会找到与此类似的内容,请注意所有行上的gvPartsToOrderDetail
属性:
data-val-validationgroup
您是否看到 <span
data-val-controltovalidate="ContentPlaceHolder1_gvPartsToOrderDetail_tbxTicketNo_0"
data-val-errormessage="RequiredFieldValidator"
data-val-validationgroup="vgSubmit"
id="ContentPlaceHolder1_gvPartsToOrderDetail_rfvTxtTicketNo_0"
data-val="true"
data-val-evaluationfunction="RequiredFieldValidatorEvaluateIsValid"
data-val-initialvalue="0" style="visibility:hidden;">*</span>
不是唯一的?
因此,当您点击data-val-validationgroup="vgSubmit"
并将btnSubmit
设置为“vgSubmit”时,它们都会被触发。
现在给出@ VDWWD的回答你可能更喜欢这样保留它。这非常合法且合法,可能更符合您的需求。
但是为了解决验证组的非唯一性,您可以在标记中执行此操作:
ValidationGroup
然后呈现:
<asp:RequiredFieldValidator ID="rfvTxtTicketNo" runat="server"
...
ValidationGroup='<%# string.Format("Submit_{0}", Container.DataItemIndex) %>'>
</asp:RequiredFieldValidator>
但现在你有设计问题了。要隔离gridview中的验证组并将其与提交按钮绑定,您需要选择一行,这意味着要引入一个Select命令按钮。更多点击,不是很好,但可以做到。但这引入了另外几个问题:
<span ... data-val-validationgroup="Submit_0" ... </span>
<span ... data-val-validationgroup="Submit_1" ... </span>
<span ... data-val-validationgroup="Submit_2" ... </span>
两者都可以这样修复:
1. How do you tell the Submit button which validation group to validate?
2. Also the Submit button has a nasty habit of Posting back regardless of validation.
以 <asp:Button ID="btnSubmit" runat="server" Text="Button"
OnClientClick="return Page_ClientValidate('vgSubmit_1')" />
编程方式生成,如下所示:
btnSubmit_PreRender
以下是代码隐藏和用于审核的页面标记:
总结一下,这个解决方案,如果你可以这样称呼:
- 唯一的验证组名称PER ROW
- 需要添加选定的行
- 呈现“提交”按钮以防止回发并隔离相应的验证组
醇>
我只能希望这至少可以提供信息,并且可能会给你一些关于服务器控件的多功能性的想法。
快乐编程......
代码背后:
protected void btnSubmit_PreRender( object sender, EventArgs e )
{
btnSubmit.OnClientClick = string.Format( "return Page_ClientValidate('vgSubmit_{0}')", gvPartsToOrderDetail.SelectedIndex );
}
标记:
namespace WebApplication3
{
public partial class _Default : Page
{
protected void Page_Load( object sender, EventArgs e )
{
if ( !Page.IsPostBack )
{
List<Parts> ListOfParts = new List<Parts>( new Parts[ ] {
new Parts(0, 0),
new Parts(0, 0),
new Parts(0, 0) } );
gvPartsToOrderDetail.DataSource = ListOfParts;
gvPartsToOrderDetail.DataBind();
}
}
protected void Button1_PreRender( object sender, EventArgs e )
{
Button1.OnClientClick = string.Format( "return Page_ClientValidate('vgSubmit_{0}')", gvPartsToOrderDetail.SelectedIndex );
}
}
//------------------------------------------------------------
// Dummy data class
//
public class Parts {
public Parts( int ticketNo, int status ) {
TicketNo = ticketNo;
Status = status;
}
public int TicketNo { get; set; }
public int Status { get; set; }
}
}