【问题标题】:Adding validation to dynamic forms向动态表单添加验证
【发布时间】:2013-09-18 13:27:45
【问题描述】:

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

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

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

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

例子:

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

【问题讨论】:

  • 动态如何?您的视图基于具有特定属性的模型,不是吗?
  • 你的意思是 jquery 验证?只在客户端?
  • @AbbasAmiri 是的,我有一个强类型的视图模型,就像我像 @foreach (FormElement element in Model.FormElements) 一样遍历它们,但元素的数量来自数据库。是的,我正在寻找客户端验证。
  • @user1361315 我向您推荐使用 HtmlHelpers,它们使您的视图干净且易于维护,并且我看不出在您的场景中使用它们有任何问题。 HtmlHelpers 完全支持验证。
  • 我会调查一下,但目前它没有使用 htmlhelpers,我该如何手动完成?

标签: javascript jquery asp.net-mvc forms validation


【解决方案1】:

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

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

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

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

基本规则结构为here

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

@if(ViewData.ContainsKey("[ElementId]")){
//if it exists
//inject json using newtonsoft json
<script>
$('#@Html.raw([ElementId])').rules("Add", JsonConvert.SerializeObject(ViewData["ElementId"]))
</script>
}

【讨论】:

    【解决方案2】:

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

    查看Demo

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

    【讨论】:

      【解决方案3】:

      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">');
      });});
      

      DEMO jsfiddle HERE

      【讨论】:

        【解决方案4】:

        您应该能够通过不显眼的验证动态地parse the elements,但是您需要添加适当的属性以首先触发适当的验证。从根本上说,这与question 中发生的事情非常相似,他们通过 javascript 动态添加元素。

        【讨论】:

          【解决方案5】:

          如果你可以输出一个 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,是我编写的一个库,是的,我现在完全向你推销它。

          【讨论】:

            【解决方案6】:

            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() 检查单个元素的有效性。您可以通过添加到类规则列表来添加其他验证规则(除了必需的)。

            【讨论】:

              【解决方案7】:

              你也可以使用Jquery Validate engine

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

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

              这对你来说很容易。

              【讨论】:

                【解决方案8】:

                我最近回答了一个关于jQuery我们不做任何事情的问题,如果你想使用自定义jQuery,参考如下:

                在表单元素上,您可以使用递归代码,例如:在复选框的情况下

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

                同样适用于其他类型的元素,例如输入、收音机等。

                On selecting a checkbox disable spefic checkboxes

                查看以上内容以获取更多信息,评论以获取更多信息或小型演示表格。

                【讨论】:

                  【解决方案9】:

                  我使用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()) {
                      ...
                  

                  【讨论】:

                    【解决方案10】:

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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2011-07-13
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-11-15
                      • 1970-01-01
                      • 1970-01-01
                      • 2019-09-19
                      • 2020-06-13
                      相关资源
                      最近更新 更多