Orchard CMS DataAnnotations - 客户端验证

Mik*_*ons 10 jquery-validate orchardcms data-annotations unobtrusive-validation asp.net-mvc-3

我试图在Orchard模块中进行不引人注意的客户端验证,但我遇到了问题.

在这个例子中,我只是尝试使用Html.TextBoxFor()在文本框字段上强制执行RequiredAttribute.

它看起来好像Orchard(LocalizedModelValidatorProvider)实现的自定义ModelValidatorProvider阻止了HTML5输入属性的呈现,具体来说:

data-val
data-val-required
Run Code Online (Sandbox Code Playgroud)

对于标准DataAnnotations RequiredAttribute.jQuery.validate.unobtrusive需要这些属性才能工作.

LocalizedModelValidatorProvider将RequiredAttribute映射到LocalizedRequiredAttribute,因此在渲染用LocalizedRequiredAttribute修饰的模型属性的文本框输入时,Orchard ViewEngine中的错误(或未实现的功能)可能是多少?

我怀疑这不会发生:

tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata));
Run Code Online (Sandbox Code Playgroud)

(来自System.Web.Mvc.Html.InputExtensions)

我目前正在运行Orchard 1.3.9.

注意:一个hacky解决方法是删除OrchardStarter模块中LocalizedModelValidatorProvider的注册,并默认返回标准MVC 3提供程序,尽管如果可能的话我不想打扰Orchard源(更不用说我可能需要本地化)消息在某些时候)......

小智 0

我花了 3 周的时间解决了 MyPrettyCMS 中对话框中使用的不显眼的验证问题。

我还使用 LocalizedRequiredAttribute ,正如您在那些AutoGenerated MetaDataModels中看到的那样。

我不了解 Orcad,但我认为它像我一样将用户表单呈现为 JQuery 对话框。

有两个困难:

第一:您必须将对话框字段(重新)附加到用于将数据发送到服务器的表单。

第二:您必须(重新)解析表单才能获得有效的、不显眼的验证

您将在这里找到一个完整的基于 JQuery 对话框的表单,可进行不显眼的验证,并将焦点放在 $.validator.unobtrusive.parse(form); 行上。这迫使分析 ajax 添加的控件变得不那么引人注目。

查看JQuery常用工具箱中的$.fn.jqDialogFunction

$.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');
}
Run Code Online (Sandbox Code Playgroud)

然后看方法 $.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();
}
Run Code Online (Sandbox Code Playgroud)