簡體   English   中英

嘗試在ASP.NET Gridview中激發RegularExpressionValidator時如何防止CompareValidator激發?

[英]How to prevent CompareValidator from firing while trying to fire RegularExpressionValidator in ASP.NET Gridview?

這是我在GridView中的一小段aspx代碼:

<asp:TemplateField HeaderText="Quantity" >
<ItemTemplate>
<asp:TextBox ID ="TextBox1" runat="server" Width="60px" DataField="Product_Quantity" Text='<%#Eval("Product_Quantity")%>' />
<asp:Button ID ="Button1" runat="server" OnClick="Quantity_Update_Click" ValidationGroup="UpdateQuantity" CommandArgument="Button12" CommandName="Update"  Text="Update" />
<asp:CompareValidator ID="CompareValidator1" runat="server" ControlToValidate="TextBox1" ErrorMessage="Must be greater than 0" Operator="GreaterThan" Type="Integer" ValueToCompare="0" />
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ErrorMessage="Numbers only but no decimals" ControlToValidate="TextBox1" ValidationExpression="^[0-9]*$"></asp:RegularExpressionValidator>      
</ItemTemplate>

在TextBox1中,如果鍵入0,則僅觸發CompareValidator消息,而這正是我想要的。

再次在TextBox1中,如果我鍵入2.5 如果我鍵入abcd,則CompareValidator消息和RegularExpressionValidator消息會同時觸發。 但是在這種情況下,我只希望觸發RegularExpressionValidator消息。 我不想觸發CompareValidator消息。

因此,如何防止CompareValidator消息和RegularExpressionValidator消息同時觸發?

這是我需要解決的唯一小問題。

如果提供了建議的修復程序或語法解決方案,將很有幫助。

在DataBound控件( GridView )中對單行的驗證非常棘手,而多次驗證則更加棘手。 CustomValidator是一個鋒利的工具,可以結合任何或所有其他ASP.NET驗證器。 這是在GridView使用CustomValidator的方式。

//.aspx
<ItemTemplate>
<asp:TextBox ID ="txtQty" runat="server" Width="60px" Text='<%#Eval("Product_Quantity")%>' />
<asp:Button ID ="Button1" runat="server" 
    OnCommand="Quantity_Update_Command"
    CommandArgument='<%#Eval("productid") %>' <%--some information. else it makes no sense --%>
    ValidationGroup='<%# "UpdateQuantity"+Container.DisplayIndex.ToString() %>' <%--validation group must be unique for each row --%>
    CommandName="Update"  Text="Update" />
    <asp:CustomValidator ID="valQty" runat="server" 
        ControlToValidate="txtQty" 
        ValidateEmptyText="true"
        ClientValidationFunction="qty_validate" <%--javascript on client --%>
        ValidationGroup='<%# "UpdateQuantity"+Container.DisplayIndex.ToString() %>' <%--validation group must be unique for each row --%>
        OnServerValidate="valQty_ServerValidate" <%--never trust user input or JS validation --%>
        >*</asp:CustomValidator>
</ItemTemplate>

自定義驗證從客戶端開始(如果可能)。

<script>
    function qty_validate(sender, args) {
        if (parseInt(args.Value) != args.Value) {
            sender.innerHTML =
                sender.errormessage = 'Numbers only but no decimals';
            args.IsValid = false;
        }
        else if (parseInt(args.Value) <= 0) {
            sender.innerHTML =
                sender.errormessage = 'Must be greater than 0';
            args.IsValid = false;
        }
    }
</script>

但這還不夠。 永遠不要相信用戶輸入和客戶端(JS)驗證。

//.cs
protected void valQty_ServerValidate(object source, ServerValidateEventArgs args)
{
    //repeat validation logic on the server
}
//extra: Call OnCommand handler instead of OnClick
//Here you can use e.CommandArgument unavailable in OnClick handler
protected void Quantity_Update_Command(object sender, CommandEventArgs e)
{
    //update product using e.CommandArgument
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM