【问题标题】:validation on a usercontrol on aspx page using javascript使用 javascript 对 aspx 页面上的用户控件进行验证
【发布时间】:2012-01-17 10:32:04
【问题描述】:

我有一个用户控件,其中包含 3 个下拉菜单(日期、月份、年份)。我在 aspx 页面上调用了这个用户控件。

请选择日期自。

在我的 aspx 页面上,所有字段都使用 javascript 验证进行验证。 当我从此用户控件中选择日期(不是月份和年份)并单击提交按钮时,它会显示错误消息。 但我的问题是,如果我选择年份(不是日期,月份),那么在这种情况下,它既不会触发错误消息,也不会保存数据。 我希望每次未选择至少一个字段(日、月、年)时它都会触发消息。我想在客户端处理这个问题。请给我你的建议。

function InputValidation(vg) {
    var isValid = true;
    try {
        var j = 0;
        var inputCtrlArr = new Array();
        var key = 'block';
        var inputIntputArr = document.getElementsByTagName('input');
        var inputDdlArr = document.getElementsByTagName('select');
        var inputTextareaArr = document.getElementsByTagName('textarea');
        var c = 0;
        for (var i = 0; inputIntputArr.length > i; i++) inputCtrlArr[c++] = inputIntputArr[i];
        for (var i = 0; inputDdlArr.length > i; i++) inputCtrlArr[c++] = inputDdlArr[i];
        for (var i = 0; inputTextareaArr.length > i; i++) inputCtrlArr[c++] = inputTextareaArr[i];
        for (var i = 0; inputCtrlArr.length > i; i++) {
            if (inputCtrlArr[i].getAttribute('required') == 'true' && inputCtrlArr[i].getAttribute('vg') == vg) {
                if (inputCtrlArr[i].value.trim() == '') {
                    //errinputReqCtrlArr[j++] = inputCtrlArr[i];
                    key = 'block';

                    isValid = false;
                }
                else {
                    key = 'none';
                }
                if (inputCtrlArr[i].type == "checkbox") {
                    if (inputCtrlArr[i].checked == false) {
                        //errinputReqCtrlArr[j++] = inputCtrlArr[i];
                        key = 'block';

                        isValid = false;
                    }
                    else {
                        key = 'none';
                    }
                }
                var errorDivId = inputCtrlArr[i].getAttribute('ErrorDivId');
                var objErrorDivId = document.getElementById(errorDivId);
                if (objErrorDivId != null) objErrorDivId.style.display = key;
            }
        }
 }
    catch (ex) { }

}



function InputCntrlValidate(obj) {
    try {
        if (obj.getAttribute('required') == 'true') {
            if (obj.value == '') {
                key = 'block';
            }
            else {
                key = 'none';
            }
            var errorDivId = obj.getAttribute('ErrorDivId');
            var objErrorDivId = document.getElementById(errorDivId);
            if (objErrorDivId != null) objErrorDivId.style.display = key;
        }
    } catch (ex) { }
}




function sanitizeInput(obj) {

    if (obj.getAttribute('msg') == obj.value) {
        alert("same value");
    }

}

【问题讨论】:

    标签: c# javascript asp.net


    【解决方案1】:

    问题出在您的 JavaScript 中。因为如果它适用于一个下拉列表,那么它应该适用于其他两个。此外,您将不得不检查月份和日期。如果是 2 月,那么天数应该是 28 或 29,这取决于年份。所以需要付出很多努力才能解决。

    【讨论】:

    • 我的下拉菜单根据月份和闰年显示天数。所有 3 个下拉菜单都在一个用户控件中,我已经在用户控件的 tagprefix 上实现了Required=true。它仅按顺序显示错误消息,首先是日期,然后是月份,然后是年份。但是如果我以相反的顺序(第一年)或中间(第一个月和第一年)选择并将日期字段留空,那么它不会显示错误消息
    【解决方案2】:

    您只需要三个RequiredFieldValidators,每个ControlToValidate 指向您的一个DropDownLists。如果您的默认值为 f.e. “请选择”您应该将其设置为验证器的InitialValue

    这是一个示例(我只添加了几个 ListItems 而不是所有日期、月份和年份):

        <asp:DropDownlist ID="DdlDate" runat="server">
            <asp:ListItem Text="please select" Enabled="true"></asp:ListItem>
            <asp:ListItem Text="1"></asp:ListItem>
            <asp:ListItem Text="2"></asp:ListItem>
            <asp:ListItem Text="3"></asp:ListItem>
        </asp:DropDownlist>
        <asp:RequiredFieldValidator ID="ReqDate" 
            ControlToValidate="DdlDate" 
            InitialValue="please select" 
            ErrorMessage="Please select Date"
            Display="Dynamic"
            runat="server">
        </asp:RequiredFieldValidator>
        <asp:DropDownlist ID="DdlMonth" runat="server">
            <asp:ListItem Text="please select" Enabled="true"></asp:ListItem>
            <asp:ListItem Text="January"></asp:ListItem>
            <asp:ListItem Text="February"></asp:ListItem>
            <asp:ListItem Text="March"></asp:ListItem>
        </asp:DropDownlist>
        <asp:RequiredFieldValidator ID="ReqMonth" 
            ControlToValidate="DdlMonth" 
            InitialValue="please select" 
            ErrorMessage="Please select Month"
            Display="Dynamic"
            runat="server" >
        </asp:RequiredFieldValidator>
        <asp:DropDownlist ID="DdlYear" runat="server">
            <asp:ListItem Text="please select" Enabled="true"></asp:ListItem>
            <asp:ListItem Text="2010"></asp:ListItem>
            <asp:ListItem Text="2011"></asp:ListItem>
            <asp:ListItem Text="2012"></asp:ListItem>
        </asp:DropDownlist>
        <asp:RequiredFieldValidator ID="ReqYear" 
            ControlToValidate="DdlYear" 
            InitialValue="please select" 
            ErrorMessage="Please select Year"
            Display="Dynamic"
            runat="server" >
        </asp:RequiredFieldValidator>
        <asp:Button ID="BtnSubmit" runat="server" Text="submit" />
    

    【讨论】:

    • 谢谢。但我不能这样做,因为它是一个用户控件,在我的应用程序中,这个控件到处用于日期选择,在我的整个应用程序中,所有验证都是客户端。如果我使用RequiredValidator,它需要很多工作。我必须在任何地方更改所需的验证器。
    • @user1029679:我认为 DropDownLists 会在 UserControl 中。因此,您只需向其中添加验证器。默认情况下,它们在客户端进行验证(必要时也在服务器端进行验证)。
    【解决方案3】:

    如果是我,我会在AjaxControlToolKit 上使用calendar control。除非该字段是强制性的,否则不需要验证。它更容易,看起来更好。所有客户端。

    只需下载 ajxcontrolkit dll 并将其包含在您的项目中并根据任何自定义控件/第三方组件使用。

    编辑:

    好的,如果您只想选择至少一个下拉菜单,请尝试 JQuery,例如

    function isDropDownsValid()
    {
    var isValid = true;
    $('select').map(function()
                {
                    if($(this).val() == -1)
                    {
                        isValid = false;
                    }
                });
    return isValid;
    }
    

    然后像这样连接到您的提交按钮

      <asp:Button ID="myButton" runat="server" OnClientClick="return isDropDownsValid" Text="Submit />
    

    这是一个带有演示的fiddle。您可能需要更改选择器 $('select') 以定位您需要的确切下拉列表。

    【讨论】:

    • 感谢 4 位回复。但它是日期选择的客户要求 3 下拉菜单。所以我不能使用日历控制。
    • @user1029679。我添加了一个 JQuery 方法来做你想做的事。干杯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多