Сбой пользовательской проверки с «Не удается прочитать ‘вызов’ свойства неопределенного» MVC jquery

#c# #asp.net-mvc #unobtrusive-validation

#c# #asp.net-mvc #ненавязчивая проверка

Вопрос:

Я ни за что на свете не могу разобраться в проблеме с этим скриптом. Я выполняю пользовательскую проверку, как в этом сообщенииhttps://www.codeproject.com/Tips/780992/Asp-Net-MVC-Custom-Compare-Data-annotation-with-Cl

Единственное, что я изменил, это некоторую обработку формата даты. Смотрите мой customcompare.js здесь:

 $.validator.addMethod("genericcompare", function (value, element, params) {
// debugger;
var propelename = params.split(",")[0];
var operName = params.split(",")[1];
if (params == undefined || params == null || params.length == 0 ||
    value == undefined || value == null || value.length == 0 ||
    propelename == undefined || propelename == null || propelename.length == 0 ||
    operName == undefined || operName == null || operName.length == 0)
    return true;
var valueOther = $(propelename).val();

if (isNaN(value)) {
    var year1 = value.split('/')[2].substring(0, 4);
    var time1 = value.split('/')[2].substring(5, 999);
    var hour1 = time1.split(':')[0];
    var minute1 = time1.split(':')[1];

    var test1 = new Date(year1, value.split('/')[1] - 1, value.split('/')[0], hour1, minute1);
    val1 = Date.parse(test1);
}
else {
    val1 = eval(value);
}

if (isNaN(valueOther)) {
    var year2 = valueOther.split('/')[2].substring(0, 4);
    var time2 = valueOther.split('/')[2].substring(5, 999);
    var hour2 = time2.split(':')[0];
    var minute2 = time2.split(':')[1];

    var test2 = new Date(year2, valueOther.split('/')[1] - 1, valueOther.split('/')[0], hour2, minute2);
    val2= Date.parse(test2);
}
else {
    val2 = eval(valueOther);
}


if (operName == "GreaterThan")
    return val1 > val2;
if (operName == "LessThan")
    return val1 < val2;
if (operName == "GreaterThanOrEqual")
    return val1 >= val2;
if (operName == "LessThanOrEqual")
    return val1 <= val2; });
$.validator.unobtrusive.adapters.add("genericcompare",
    ["comparetopropertyname", "operatorname"], function (options) {
        options.rules["genericcompare"] = "#"  
            options.params.comparetopropertyname   ","   options.params.operatorname;
        options.messages["genericcompare"] = options.message;
    });
  

Ошибка, которую я получаю: «Неперехваченный TypeError: не удается прочитать ‘вызов’ свойства undefined. Исключение возникло при проверке элемента LaycanStartDate, проверьте метод ‘genericcompare'»

Модель:

 [Display(Name = "LaycanStartDate", ResourceType = typeof(Resources.Resources))]
    [DataType(DataType.DateTime)]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy hh:mm}")]
    [GenericCompare(CompareToPropertyName = "LaycanEndDate", OperatorName = GenericCompareOperator.LessThanOrEqual, ErrorMessageResourceName = "LaycanStartBeforeEnd",ErrorMessageResourceType = typeof(Resources.Resources))]
    public DateTime LaycanStartDate { get; set; }
  

Комментарии:

1. Поскольку вы получаете данные value от пользователя, запускать eval на нем довольно опасно.

Ответ №1:

Вы используете пользовательскую логику проверки jQuery с ненавязчивым сценарием проверки. Отключите ненавязчивый для соответствующей страницы, и проблема будет устранена.