2

我从数据库中提取要在特定表单上显示的内容,因此表单元素是动态的。

我根据我希望表单的显示方式显示单选按钮、复选框或文本框/文本区域。

在有人提交表单之前,我必须验证是否已选择每个表单条目(单选、复选框、文本框等)。

如何向这些动态表单元素插入验证?

例子:

<input type="checkbox" id="@formInputId" name="@formInputName" value="@element.Id"  />
4

10 回答 10

4

首先,您还可以将 JSON/Javascript 注入视图。尽管这不是首选,因为那样您将无法从中制作单独的 js 文件。但在验证动态表单的情况下,我早先这样做了。

由于您的表单 ID 来自您知道每个控件的 ID 的数据库,因此您可以使用 jquery 分别识别每个元素。

jquery 验证插件使添加验证规则变得非常容易。因此,您只需使用类似的东西在服务器端制作验证规则。

forEach(FormElement element in Model.FormElements){
 dynamic rules = new ExpandoObject();
 //set all the rule here.
 ViewBag.ElementId = rules;
}

这里给出了基本的规则结构。

然后在渲染控件时在视图内。检查

@if(ViewData.ContainsKey("[ElementId]")){
//if it exists
//inject json using newtonsoft json
<script>
$('#@Html.raw([ElementId])').rules("Add", JsonConvert.SerializeObject(ViewData["ElementId"]))
</script>
}
于 2013-09-18T14:49:25.750 回答
2

你看过jquery验证插件吗?为什么要重新发明轮子。使用起来非常简单。

检查这个演示

这是官方文档的链接。http://jqueryvalidation.org/documentation/

于 2013-09-18T14:57:11.170 回答
1

html

<form id="myform">
<input name="product[0][name]" id="form_product[0][name]" data-rule-required="true" />
<input name="product[1][name]" id="form_product[1][name]" data-rule-required="true" />
<input name="product[2][name]" id="form_product[2][name]" data-rule-required="true" />
<br/>
<br/>
<br/>
<input type="submit" />



添加一个字段验证文档

css

#docs {
display: block;
position: fixed;
bottom: 0;
right: 0;

}

js

$(document).ready(function () {

$('#myform').validate({ // initialize the plugin      
    submitHandler: function (form) { // for demo
        alert('valid form submitted'); // for demo
        return false; // for demo
    }
});

$('button').one('click', function () {
    $('#myform').append('<input name="product[3][name]" id="form_product[3][name]" data-rule-required="true">');
});});

在这里演示 jsfiddle

于 2013-09-22T18:54:33.093 回答
0

我想最好的方法是使用 $.validate 插件进行客户端验证,并在您的 POST 操作中创建方法来验证您的数据。我总是建议不要将 javascript 与 csharp 或其他地方混合,以保持事物的组织性。

于 2013-09-25T13:52:24.873 回答
0

如果你可以输出一个 json 验证块,你可以使用这个:https ://github.com/parris/iz#json

它会让你指定一个 JSON blob 规则,如下所示:

var rules = {
    'cost': [
        {
            'rule': 'between',
            'args': [17, 1000],
            'error': 'The cost must be between 17, 1000'
        },
        {
            'rule': 'required',
            'error': 'You must specify a cost'
        },
    ],
    'producer.id': [
        {
            'rule': 'int',
            'error': 'Producer ID must be an int'
        }
    ],
    'producer.name.first': [
        {
            'rule': 'alphaNumeric',
            'error': 'Must be names and numbers'
        }
    ]
};

然后收集您的值并像这样进行验证:

are(rules).validFor({
    cost: 20,
    producer: {
        id: 1,
        name: {
            first: 'bob'
        }
    }
});

它有一些内置验证,应该非常符合您的需要。如果没有,您可以在一些自定义验证中填充。

注意:Iz,是我写的一个库,是的,我现在完全向你推销它。

于 2013-09-18T17:22:49.973 回答
0

我最近回答了一个问题,我们不使用 jQuery,如果您想使用自定义 jQuery,请参考如下:

在表单元素上,您可以将递归代码用于 ex:在复选框的情况下

$(document).ready(function () {
    $('#new_user_form *').filter(':checkbox').each(function(){
        if(this.id=='row1' && this.value=='3') {
        } else {
            $(this).attr("checked",false);
        }
    });
});

对于其他类型的元素(即输入、收音机等)也适用。

在选择一个复选框时禁用特定的复选框

查看上面的更多信息,评论更多信息或一个小的演示表格。

于 2013-09-24T13:09:02.977 回答
0

您应该能够使用不显眼的验证动态解析元素,但是您需要添加适当的属性以首先触发适当的验证。从根本上讲,它与这个问题中发生的事情非常相似,他们通过 javascript 动态添加元素。

于 2013-09-18T14:26:30.627 回答
0

我已经使用jQuery Validation Plugin达到了同样的要求

将以下代码放在页面的脚本部分。您需要将form-data类添加到表单中,并required_field在将元素添加到页面时添加。

var validator = null;
$(document).ready(function () {
    try {
        var validatedForm = $(".form-data");
        validator = validatedForm.validate && validatedForm.validate({
            rules: {
                required_field: {
                    required: true
                }
            },
            messages: {
                required_field: {
                    required: " "
                }
            },
            errorElement: "span",
            showErrors: function (errorMap, errorList) {
                this.defaultShowErrors();
            },
            highlight: function (element) {
                // do something like
                $(element).closest('...').removeClass('success').addClass('error');
            },
            unhighlight: function (element) {
                // do something like
                $(element).closest('...').removeClass('error');
            },
            submitHandler: function(form) {
                // submit form
                form.submit();
            }
            success: function (element) {
                // do something like
                $(element).closest('...').removeClass('error').end().remove();
            },
            onfocusout: function (element) {
                $(element).valid();
            },
        });

        $.each($(".required_field"), function (index, value){
            $(value).rules( "add", {
                  required: true,
                  messages: {
                      required: " "
                  }
            });
        });
    } catch(err) {
        console.log("javascript error", err);
    }
});

提交时,您可以检查表单是否有效:

if($('#formId').valid()) {
    ...
于 2013-09-25T12:33:29.983 回答
0

JQuery Validate 插件应该可以工作(参见http://jqueryvalidation.org)。

听起来您只需要标记所有必需的字段,因此您可以通过使用类向它们添加必需的规则,这将避免必须在模型和 javascript 之间协调动态元素的 ID/名称。

将输入行更改为:

<input type="checkbox" id="@formInputId" name="@formInputName" 
    value="@element.Id" class="requiredField" />

然后在你的javascript中:

$(document).ready(function() {
    var form = $( "#MyForm" );
    form.validate();

    jQuery.validator.addClassRules('requiredField', {
        required: true
    });

    form.on('submit', function () {
        if (form.valid()) {
            form.submit();
        }
    });
});

您还可以使用 . 检查单个元素的有效性(selector).valid()。您可以通过添加到类规则列表来添加其他验证规则(除了必需的)。

于 2013-09-19T15:42:39.693 回答
0

您还可以使用Jquery Validate engine

其中,您只需要管理动态元素的类属性。

我建议你,你可以使用Jquery Validate Engine 的 Hook

这对你来说很容易。

于 2013-09-24T06:48:33.927 回答