Orchard CMS DataAnnotations - Проверка на стороне клиента - PullRequest
10 голосов
/ 07 февраля 2012

Я пытаюсь заставить ненавязчивую проверку на стороне клиента работать в модуле Orchard, но у меня возникла проблема.

В этом примере я просто пытаюсь применить атрибут RequiredAttribute к текстовому полю, используя Html.TextBoxFor ().

Мне кажется, что пользовательский ModelValidatorProvider, реализованный Orchard (LocalizedModelValidatorProvider), предотвращает отображение входных атрибутов HTML5, а именно:

data-val
data-val-required

для стандартного DataAnnotations RequiredAttribute. Эти атрибуты необходимы для работы jQuery.validate.unobtrusive.

LocalizedModelValidatorProvider сопоставляет RequiredAttribute с LocalizedRequiredAttribute, так что, возможно, это ошибка (или не реализованная функция) в Orchard ViewEngine при рендеринге ввода текстового поля для свойства модели, украшенного LocalizedRequiredAttribute?

Я подозреваю, что как-то этого не происходит:

tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata));

(из System.Web.Mvc.Html.InputExtensions)

В настоящее время я работаю в Orchard 1.3.9.

Примечание: Хакерский обходной путь - удалить регистрацию LocalizedModelValidatorProvider в модуле OrchardStarter и вернуться по умолчанию к стандартному поставщику MVC 3, хотя я стремлюсь не беспокоить источник Orchard, если вообще возможно (не говоря уже о том, что в какой-то момент мне могут понадобиться локализованные сообщения) ...

Ответы [ 2 ]

0 голосов
/ 16 декабря 2013

Добавьте этот код в представление шаблона вашего редактора

 @model ABC.Models.ModelName
@{


Script.Require("jQuery").AtHead();
Script.Include("jquery.validate.min.js").AtHead();
Script.Include("jquery.validate.unobtrusive.min.js").AtHead(); }

Добавьте "jquery.validate.min.js, jquery.validate.unobtrusive.min.js" в папку вашего модуля "Сценарии".

Добавьте приведенную ниже настройку в файл Web.cofig.

<appSettings>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>
0 голосов
/ 11 марта 2013

Я трачу 3 недели, чтобы решить проблему ненавязчивой проверки, используемой в диалоговых окнах в MyPrettyCMS.

Я также использую LocalizedRequiredAttribute, как вы можете видеть в этих AutoGenerated MetaDataModels .

Я не знаю Orcad, но полагаю, что он представляет пользовательские формы в виде диалогов JQuery, как и я.

Есть две трудности:

1-й: вы должны (заново) прикрепить диалоговые поля к форме, которую вы будете использовать для отправки данных на сервер.

2-й: вы должны (пере) проанализировать форму, чтобы получить рабочую ненавязчивую проверку

Здесь вы найдете полную формула на основе JQuery Dialog , работающую с ненавязчивой проверкой и выделите строку $ .validator.unobtrusive.parse (форма); Эта сила ненавязчиво анализирует добавленные элементы управления ajax.

Посмотрите $ .fn.jqDialogFunction в общем наборе инструментов JQuery

$.fn.jqDialogFunction = function (idDiv, titre, okFunction, openFunction) {
    var dialogBox = $(idDiv)
    //$(dialogBox).removeClass("notDisplayed");
    $(dialogBox).hide();
    $(dialogBox).dialog({
        title: titre,
        autoOpen: false,
        resizable: false,
        modal: true,
        minHeight: 450,
        minWidth: 800,
        open: openFunction,
        buttons: [
    {
        text: "Ok",
        click: okFunction
    }
            ,
            {
                text: "Cancel",
                click: function () {
                    $(this).dialog("close");
                }
            }
    ]
    });
    var form = dialogBox.find("form");
    if (form != null) {
        $.validator.unobtrusive.parse(form);
    }
    $(idDiv).dialog('open');
}

Затем посмотрите метод $ .fn.SaveContent -> $ ("# divStructurePage"). Parent (). AppendTo (form);

$.fn.SaveContent = function () {
    $(this).dialog("close");
    var content = tinyMCE.activeEditor.getContent();
    $("#hidNewContent").val(content);
    var v = $("#StructurePage_FK_LayoutMenu_Translation").val();
    var form = $("#frmManagedContent");
    $("#divStructurePage").parent().appendTo(form);
    form.attr("action", "/"+ $("#hidControllerName").val() +"/Save/" + v);
    form.submit();
}
...