We found that following features are totally undocumented , where <text> is a custom string :
- options.fields.fieldName.validation.<attribute> = value; is generally passed-through like ad HTML attribute when kendo.ui.Editable is involved for editing corresponding model field <fieldName>
- And so on options.fields.fieldName.validation.validationMessage = "My custom message"; is generally passed-through like ad HTML attribute onto the corresponding INPUT dom element and it is very usefull when you need a custom validation message avoiding to deal with direct DOM manipulation
- No document in your online KB mentions this behaviour associated to the Model.define() instead a KB page could be find related to the Validator https://docs.telerik.com/kendo-ui/controls/editors/validator/overview#application-of-custom-message-attributes , I think could save time to developers know that it is possibile and should be documented
Proofs in your code :
The CreateAttributes assembles object which contains the name:value pair from model field validation :
function createAttributes(options) { var field = (options.model.fields || options.model)[options.field], type = fieldType(field), validation = field ? field.validation : {}, ruleName, DATATYPE = kendo.attr('type'), BINDING = kendo.attr('bind'), rule, attr = { name: options.field, title: options.title }; for (ruleName in validation) { // ruleName can contains a custom string that is not a validation rule // and rule will contain its value, for example validationMessage='MyMessage ....' rule = validation[ruleName]; if (inArray(ruleName, specialRules) >= 0) { attr[DATATYPE] = ruleName; } else if (!isFunction(rule)) { attr[ruleName] = isPlainObject(rule) ? rule.value || ruleName : rule; } attr[kendo.attr(ruleName + '-msg')] = rule.message; } if (inArray(type, specialRules) >= 0) { attr[DATATYPE] = type; } attr[BINDING] = (type === 'boolean' ? 'checked:' : 'value:') + options.field; return attr;}
The editor choosed by the kendo.ui.Editable sets DOM attributes via attr() and the previously assembled object
var editors = { 'number': function (container, options) { var attr = createAttributes(options); $('<input type="text"/>').attr(attr).appendTo(container).kendoNumericTextBox({ format: options.format }); $('<span ' + kendo.attr('for') + '="' + options.field + '" class="k-invalid-msg"/>').hide().appendTo(container); }, 'date': function (container, options) { var attr = createAttributes(options), format = options.format; if (format) { format = kendo._extractFormat(format); } attr[kendo.attr('format')] = format; $('<input type="text"/>').attr(attr).appendTo(container).kendoDatePicker({ format: options.format }); $('<span ' + kendo.attr('for') + '="' + options.field + '" class="k-invalid-msg"/>').hide().appendTo(container); }, 'string': function (container, options) { var attr = createAttributes(options); $('<input type="text" class="k-input k-textbox"/>').attr(attr).appendTo(container); }, 'boolean': function (container, options) { var attr = createAttributes(options); $('<input type="checkbox" />').attr(attr).appendTo(container); }, 'values': function (container, options) { var attr = createAttributes(options); var items = kendo.stringify(convertItems(options.values)); $('<select ' + kendo.attr('text-field') + '="text"' + kendo.attr('value-field') + '="value"' + kendo.attr('source') + '=\'' + (items ? items.replace(/\'/g, ''') : items) + '\'' + kendo.attr('role') + '="dropdownlist"/>').attr(attr).appendTo(container); $('<span ' + kendo.attr('for') + '="' + options.field + '" class="k-invalid-msg"/>').hide().appendTo(container); }};
The validator looks the ruleKey validationMessage directly on DOM element of a INPUT tag
var Validator = Widget.extend({ // ... _extractMessage: function (input, ruleKey) { var that = this, customMessage = that.options.messages[ruleKey], fieldName = input.attr(NAME), nonDefaultMessage; if (!kendo.ui.Validator.prototype.options.messages[ruleKey]) { nonDefaultMessage = kendo.isFunction(customMessage) ? customMessage(input) : customMessage; } customMessage = kendo.isFunction(customMessage) ? customMessage(input) : customMessage; return kendo.format(input.attr(kendo.attr(ruleKey + '-msg')) || input.attr('validationMessage') || nonDefaultMessage || input.attr('title') || customMessage || '', fieldName, input.attr(ruleKey) || input.attr(kendo.attr(ruleKey))); } // ...})
With this technique you can customize one validation message for a model field
