Orchard CMS DataAnnotations - проверка на стороне клиента

Я пытаюсь получить ненавязчивую проверку на стороне клиента, работающую в модуле 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, если на все возможно (не говоря уже о том, что мне могут понадобиться локализованные сообщения в какой-то момент)...

Ответ 1

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

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

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

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

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

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

Здесь вы найдете полную JQuery Dialog основанную форму, которая работает с ненавязчивой проверкой и фокусирует строку $.validator.unobtrusive.parse(form); Эта сила не требует анализа элементов управления, добавленных 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();
}

Ответ 2

Добавьте этот код в свой шаблонный шаблон редактора

 @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>