如何在验证日期时在jqgrid中使用monthNames?

时间:2010-06-14 21:32:07

标签: validation jqgrid

在我的jqgrid中,当我点击添加新记录时,我的日期字段预先填充了当前日期。日期格式为yyyy-MMM-d(例如2010年1月23日)。 日期是必填字段,当我点击提交按钮时,验证失败并显示该日期无效的错误,并且它需要Y-m-d格式。

如何使用jqgrid检查我的值?换句话说,如何在验证2010年1月23日时使jqgrid接受以下日期格式?

感谢。

这是我的JSON数据:

{"rows":[

{"id":1,"cell":["2010-Mar-3","Pepto","2","False","not active"]},
{"id":2,"cell":["2009-May-6","Tylenol","5","False","not active"]},
{"id":3,"cell":["2008-May-6","Aspirin","9","True","active"]}

]}},

这是我的日期列定义:

{ name: 'Date', 
index: 'date', 
width: '80px', 
align: 'center', 
sortable: false,
editable: true, 
datefmt: 'Y-M-d', 
editoptions: { dataInit: function(elem) { $(elem).datepicker({ dateFormat: 'yy-M-d' });},value: getDate } ,
editrules: { required: true, date:true} },

getdate函数将当前日期插入字段。这是功能:

 function getDate(){
        var monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
        var now = new Date();
        return now.getFullYear() + "-" + monthNames[now.getMonth()] + "-" + now.getDate();
    }

也许这是因为这个功能?我可以从datepicker插入当前日期吗?

从服务器发送的数据量不是太大(大约10-30行),最多50个人将使用此应用程序,因此不会担心数据量。

如果我在该字段中有2010年6月23日的价值,我会收到错误消息:输入有效日期值 - Y-M-d

2 个答案:

答案 0 :(得分:2)

验证您是否在datefmt: 'Y-M-d'的列定义中定义了colModel。在editrules选项列表中(请参阅http://www.trirand.com/jqgridwiki/doku.php?id=wiki:common_rules#editrules)定义如果您使用date: true作为editrules选项,则验证将与{{1}对应选项。

如果在jqGrid中使用日期,还有一些建议:

如果您尚未使用,请考虑datefmt的{​​{1}}函数内jQuery.datepicker的使用情况(请参阅http://jqueryui.com/demos/datepicker/#date-formats)(例如

dataInit

在最简单的情况下)。如果您使用搜索日期字段,则可以editoptions同样使用editoptions: { dataInit : function (elem) { $(elem).datepicker(); } // ... } 同样dataInit(请参阅http://www.trirand.com/jqgridwiki/doku.php?id=wiki:singe_searching#colmodel_options)。在jqGrid中使用jQuery.datepicker非常简单,但它可以让您的程序更加舒适。

使用标准日期格式化程序(searchoptions)可以将源数据格式发送到jqGrid转换为将要显示的新格式。例如,

jQuery.datepicker

它不那么有趣,但它可以减少从服务器发送到客户端的数据量。

更新:我必须承认,我没有使用完全符合您的数据格式来测试我的建议。刚才我再测试了一次,然后仔细阅读了关于formatter: 'date'的jqGrid文档(参见http://www.trirand.com/jqgridwiki/doku.php?id=wiki:colmodel_options)。对于formatter: 'date', formatoptions: {srcformat:'y-m-d', newformat: 'Y-M-d' } ,只支持数月格式!因此,日期验证时的值必须采用数字格式。我们能做什么?例如关注

我们定义为datefmt函数“添加”参数的参数(请参阅http://www.trirand.com/jqgridwiki/doku.php?id=wiki:navigator参数datefmt),如下所示:

navGrid

因此,我们将prmAdd字段转换为{ beforeCheckValues: function(posdata, formid, mode) { var data = posdata.Date; var dateParts = data.split("-"); var mounth = dateParts[1]; var mounths = $.jgrid.formatter.date.monthNames; var iMounth = -1; for (var i=0; i<12; i++) { if (mounth === mounths[i]) { iMounth = i; break; } } if (iMounth !== -1) { posdata.Date = dateParts[0]+'-'+(iMounth+1)+'-'+dateParts[2]; } }, beforeSubmit: function(postdata, formid) { var data = postdata.Date; var dateParts = data.split("-"); var mounths = $.jgrid.formatter.date.monthNames; postdata.Date = dateParts[0]+'-'+ $.jgrid.formatter.date.monthNames[dateParts[1]-1]+ '-'+dateParts[2]; return [true,""]; } } 函数内的数字格式,然后在使用Date后将所有字段转换回原始格式(如2010年1月23日) 。它会起作用。

现在的主要问题是:我们从这种日期检查中获得了一些优势吗?我们可以不要使用 beforeCheckValues并在checkDate函数内部实现我们自己的日期检查。如果我们发现错误的日期,我们应该返回editrules: { date:true },我们的自定义错误消息“我的错误消息”将由jqGrid显示。

如果我们可以将日期格式更改为任何数字形式(Y-mm-d,mm / d / Y或其他格式),我们会收到您问题的最简单解决方案。使用beforeSubmit会使用户格式问题不是很重要。想一想,选择你喜欢的方式。

答案 1 :(得分:1)

我遇到了类似的问题。我已经使用自定义函数进行了验证。我起诉日期格式为'23 -Jan-05'。您可以修改它以适合您所需的日期格式。

function datecheck(value, colname) {
            var dateParts = value.split("-");
            var datePart = dateParts[0];
            var mounth = dateParts[1];
            var yearPart = dateParts[2];

            var mounths = $.jgrid.formatter.date.monthNames;
            var monthPart = -1;
            for (var i = 0; i < 12; i++) {
                if (mounth === mounths[i]) {
                    monthPart = i + 1;
                    break;
                }
            }
            var dateText = monthPart + '-' + datePart + '-' + yearPart;
            var date = Date.parse(dateText);
            if (isNaN(date)) 
                return [false,"Invalid date. Format expected: dd-mmm-yy. (23-Jul-05)"];
            else 
            return [true,""];                  

        }

JQGrid列详细信息:

colModel: [name: 'JoiningDate', align: "center", editable: true, 
           editrules: { custom: true, custom_func: datecheck },
           formatter: 'date', formatoptions: { srcformat: 'y-m-d', newformat: 'd-M-y' }, edittype: 'text', editable: true,
           editoptions: { dataInit: function (el) { setTimeout(function () { $(el).datepicker({ dateFormat: 'd-M-y' }); }, 200); } }
            },

希望这有帮助。

此致

Abhilash