繁体   English   中英

验证失败时,前进到按钮代码后面…如何在没有Page.IsValid的情况下解决该问题?

[英]advancing to button code-behind when validation fails… how to solve it without Page.IsValid?

我有一个ASP .NET页,其中既包含ASP .NET验证程序,也包含一些JavaScript检查程序。 我正在浏览后面的按钮代码:

protected void Button2_Click(object sender, EventArgs e)
    {
        if (Page.IsValid)
        {
            /// ...

即使验证失败! Page.IsValid检查可以解决该问题,但是它还会重置所有JavaScript变量……可能有一种方法不进入按钮代码吗? 我在页面上也有一个Ajax更新面板和一些图像按钮……我可能会注意什么? 提前致谢!

这是我的aspx:

<%@ Page Language="C#" AutoEventWireup="true" 
CodeBehind="WebForm2.aspx.cs" 
Inherits="WebForm2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div style="width: 500px;">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>

        <script type="text/javascript">
            var nrOptions = 0;
            alert(nrOptions + " - variable initialized");
            function IncrementQuantity() {
                nrOptions++;
                alert(nrOptions);
            }
            function DecrementQuantity() {
                nrOptions--;
                alert(nrOptions);
            }
            function MoreThanTwo() {
                alert(nrOptions);
                if (nrOptions > 1) {
                    alert('okay - you have: ' + nrOptions);
                    return true;
                }
                else {
                    alert('error - must have at least two options, you only have: ' + nrOptions);
                    return false;
                }
            }            
        </script>

        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:Repeater ID="Repeater1" runat="server" OnItemCommand="Repeater1_ItemCommand">
                    <HeaderTemplate>
                        Fill in with two or more options:<br />
                        <table border="1" width="100%">
                    </HeaderTemplate>
                    <ItemTemplate>
                        <tr>
                            <td valign="middle">
                            </td>
                            <td valign="middle">
                                Description:
                                <asp:TextBox ID="TBox1" runat="server" Width="120px" Text='<%# Eval("Desc")%>'></asp:TextBox>
                                <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TBox1"
                                    ValidationGroup="InsertVal" ErrorMessage="*"></asp:RequiredFieldValidator>
                                Points:
                                <asp:TextBox ID="TBox2" runat="server" Width="20px" Text='<%# Eval("Pont")%>'></asp:TextBox>
                                <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="TBox2"
                                    ValidationGroup="InsertVal" ErrorMessage="*"></asp:RequiredFieldValidator>
                                <asp:Button ID="ImageButton1" runat="server" Text="x" CommandName="DeleteRow" OnClientClick="DecrementQuantity();" />
                                <asp:RegularExpressionValidator ID="RegularExpressionValidator1" ControlToValidate="TBox2"
                                    ValidationExpression="\d+" ValidationGroup="InsertVal" runat="server"
                                    ErrorMessage="Number >= 0."></asp:RegularExpressionValidator>
                            </td>
                        </tr>
                    </ItemTemplate>
                    <FooterTemplate>
                        <tr>
                            <td colspan="2" align="right">
                                <asp:Button ID="lnkAddRow" runat="server" Text="Add option" OnClientClick="IncrementQuantity();"
                                    CommandName="AddRow" OnClick="lnkAddRow_Click" />
                            </td>
                        </tr>
                        </table>
                    </FooterTemplate>
                </asp:Repeater>
                <br />
                <p style="text-align: right;">
                    <asp:Button ID="Button2" runat="server" Text="Save" OnClick="Button2_Click" OnClientClick="return MoreThanTwo();"
                        ValidationGroup="InsertVal" />
                </p>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    </form>
</body>
</html>

而我的代码背后:

使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用System.Web; 使用System.Web.UI; 使用System.Web.UI.WebControls; 使用System.Data;

public partial class WebForm2 : System.Web.UI.Page
{        

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            DTable = EmptyDTOptions();
            Repeater1.DataSource = DTable;
            Repeater1.DataBind();
        }
    }

    protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
    {

        if (e.CommandName == "AddRow")
        {
            DTable.Rows.Add(0, "", "");
            Repeater1.DataSource = DTable;
            Repeater1.DataBind();
            return;
        }

        if (e.CommandName == "DeleteRow")
        {

            int idx = e.Item.ItemIndex;
            DTable.Rows.RemoveAt(idx);
            Repeater1.DataSource = DTable;
            Repeater1.DataBind();
            return;
        }

    }

    protected void lnkAddRow_Click(object sender, EventArgs e)
    {
        foreach (RepeaterItem item in Repeater1.Items)
        {
            int idx = item.ItemIndex;

            TextBox tb1 = (TextBox)item.FindControl("TBox1");
            TextBox tb2 = (TextBox)item.FindControl("TBox2");

            DTable.Rows[idx]["Desc"] = tb1.Text;
            DTable.Rows[idx]["Pont"] = tb2.Text;
        }
    }

    protected void Button2_Click(object sender, EventArgs e)
    {
        if (Page.IsValid)
        {                
            // save!             
        }
    }

    private DataTable DTable
    {
        get
        {
            DataTable _dt = (DataTable)Session["DTable"];
            if (Object.Equals(_dt, null))
            {
                _dt = EmptyDTOptions();
                Session.Add("DTable", _dt);
            }
            return _dt;
        }
        set
        {
            Session["DTable"] = value;
        }
    }

    DataTable EmptyDTOptions()
    {
        DataTable dt = new DataTable();
        DataColumn dc;

        dc = new DataColumn("OptionNr", System.Type.GetType("System.Int32"));
        dt.Columns.Add(dc);
        dc = new DataColumn("Desc");
        dt.Columns.Add(dc);
        dc = new DataColumn("Pont");
        dt.Columns.Add(dc);

        return dt;
    }
}

我认为它显示了我正在努力避免的事情...验证失败(并重置javascript变量)前进到button2_click ...为了获取两对或更多对物品的列表,其中一个是一个号码。

除了可以从按钮上的OnClientClick调用函数外,还可以添加一个CustomValidator来调用JavaScript函数。

<asp:CustomValidator ID="CheckMoreThanTwo" runat="server"                       
                     ValidationGroup="InsertVal"
                     ClientValidationFunction="MoreThanTwo" />

然后,如下修改您的JavaScript函数:

function MoreThanTwo(source, arguments) {      
    alert(nrOptions);      
    if (nrOptions > 1) {      
        alert('okay - you have: ' + nrOptions);      
        arguments.IsValid=true;
    } else {      
        alert('error - must have at least two options, you only have: '
                  + nrOptions);      
        arguments.IsValid=false;
    }      
}                  

这样做可以使您的自定义JavaScript验证与ASP.NET使用的所有验证代码一起使用。 例如,如果您更改为验证摘要或更改验证组,则此自定义验证器将继续按照其余验证器的工作方式进行工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM