【问题标题】:Integrating qTip with MVC3 and jQuery Validation (errorPlacement)将 qTip 与 MVC3 和 jQuery 验证集成 (errorPlacement)
【发布时间】:2011-07-23 17:19:26
【问题描述】:

我正在使用 MVC3 开发一个项目,并且我正在尝试将 qTip2 与 jQuery 验证集成,以便将错误显示为浮动提示。我遇到的问题是,显然在表单验证上调用 errorPlacement 没有做任何事情,猜测它与 MVC 处理它的方式有关。

基本上,我想做的是使用 MVC3 和 jQuery(注释)之间的集成验证,但也与 qTip 集成以更改错误消息的显示方式。

我已经搜遍了,我能找到的最好的结果是有人建议修改 jquery.validate.unobtrusive.js - onError 函数,但我检查了它,不知道如何正确修改它,而且更喜欢一个解决方案这不需要我更改现有脚本。

感谢您的帮助。

到目前为止我所拥有的:

我的模特:

public class User
{
    [Required]
    public string Id { get; set; }

        [Required]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    public string FirstName { get; set; }

    public string SecondName { get; set; }

    public string LastName { get; set; }
}

我认为我的javascript:

$('#Form').validate({
    errorClass: "errormessage",
    errorClass: 'error',
    validClass: 'valid',
    errorPlacement: function (error, element) {
        // Set positioning based on the elements position in the form
        var elem = $(element),
            corners = ['left center', 'right center'],
            flipIt = elem.parents('span.right').length > 0;

        // Check we have a valid error message
        if (true) {
            // Apply the tooltip only if it isn't valid
            elem.filter(':not(.valid)').qtip({
                overwrite: false,
                content: error,
                position: {
                    my: corners[flipIt ? 0 : 1],
                    at: corners[flipIt ? 1 : 0],
                    viewport: $(window)
                },
                show: {
                    event: false,
                    ready: true
                },
                hide: false,
                style: {
                    classes: 'ui-tooltip-red' // Make it red... the classic error colour!
                }
            })

            // If we have a tooltip on this element already, just update its content
            .qtip('option', 'content.text', error);
        }

        // If the error is empty, remove the qTip
        else { elem.qtip('destroy'); }
    },
    success: $.noop // Odd workaround for errorPlacement not firing!
})

$('#Form').submit(function () {
    if (!$(this).valid())
        return false;

    $.ajax({
        url: this.action,
        type: this.method,
        data: $(this).serialize(),
        beforeSend: function () {
        },
        success: function (result) {
        },
        error: function (result) {
        }
    });
    return false;
});

【问题讨论】:

    标签: jquery validation asp.net-mvc-3 qtip errorplacement


    【解决方案1】:

    很好的解决方案,谢谢,我已经在我的应用程序中使用了这个。

    ...进一步补充,我没有直接修改 jquery.validate.unobtrusive.min.js 文件,而是使用以下来修改不显眼验证的默认行为。

    $(document).ready(function () {
    
                var settngs = $.data($('form')[0], 'validator').settings;
                settngs.errorPlacement = function(error, inputElement) {
                    // Modify error placement here
                };
    });
    

    Eagerly Performing ASP.NET MVC 3 Unobtrusive Client Side Validation

    【讨论】:

      【解决方案2】:

      替代解决方案

      我的第一个解决方案奏效了,但在某些情况下也引起了一些意想不到的行为。我通过在同一个 js 文件中的 onError 函数中包含 errorPlacement 代码来修复:

      function onError(error, inputElement) {  // 'this' is the form element
          var container = $(this).find("[data-valmsg-for='" + inputElement[0].name + "']"),
              replace = $.parseJSON(container.attr("data-valmsg-replace")) !== false;
      
          container.removeClass("field-validation-valid").addClass("field-validation-error");
          error.data("unobtrusiveContainer", container);
      
          if (replace) {
              container.empty();
              error.removeClass("input-validation-error").appendTo(container);
          }
          else {
              error.hide();
          }
      
          var element = inputElement;
          // Set positioning based on the elements position in the form
          var elem = $(element),
                              corners = ['left center', 'right center'],
                              flipIt = elem.parents('span.right').length > 0;
      
          // Check we have a valid error message
          if (!error.is(':empty')) {
              // Apply the tooltip only if it isn't valid
              elem.filter(':not(.valid)').qtip({
                  overwrite: false,
                  content: error,
                  position: {
                      my: corners[flipIt ? 0 : 1],
                      at: corners[flipIt ? 1 : 0],
                      viewport: $(window)
                  },
                  show: {
                      event: false,
                      ready: true
                  },
                  hide: false,
                  style: {
                      classes: 'ui-tooltip-red' // Make it red... the classic error colour!
                  }
              })
      
              // If we have a tooltip on this element already, just update its content
              .qtip('option', 'content.text', error);
          }
      
          // If the error is empty, remove the qTip
          else { elem.qtip('destroy'); }
      }
      

      然后你可以提交一个表单,以这种方式检查验证:

      $('#frm').submit(function () {
          if (!$(this).valid())
              return false;
      
          $.ajax({
              url: this.action,
              type: this.method,
              data: $(this).serialize(),
              beforeSend: function () {
              },
              success: function (result) {
              },
              error: function (result) {
              }
          });
          return false;
      });
      

      【讨论】:

      • 上述解决方案也解决了我提到的问题。谢谢!
      • 关于如何在向服务器发布后返回的服务器端验证消息显示提示的任何想法?
      • @Nick-Olsen - qTip 集成与 jQuery 客户端验证一起使用...为了实现它以进行服务器端验证,我想您必须根据具体情况对其进行编程。但我不确定是否有更好的方法。我认为这本身可能是一个问题。发布它,以便您可以从整个社区获得帮助...
      • 我顺便想出了办法。可以在这里找到解决方案stackoverflow.com/questions/7017030/…
      • @Nick-Olsen - 很酷...我以后可能会使用它...谢谢。
      【解决方案3】:

      我的解决方案 - 可以在单独的 .js 文件中使用,如果放在母版页中,则适用于整个网站。

      $(document).ready(function () {
          //validation - make sure this is included after jquery.validate.unobtrusive.js
          //unobtrusive validate plugin overrides all defaults, so override them again
          $('form').each(function () {
              OverrideUnobtrusiveSettings(this);
          });
          //in case someone calls $.validator.unobtrusive.parse, override it also
          var oldUnobtrusiveParse = $.validator.unobtrusive.parse;
          $.validator.unobtrusive.parse = function (selector) {
              oldUnobtrusiveParse(selector);
              $('form').each(function () {
                  OverrideUnobtrusiveSettings(this);
              });
          };
          //replace validation settings function
          function OverrideUnobtrusiveSettings(formElement) {
              var settngs = $.data(formElement, 'validator').settings;
              //standard qTip2 stuff copied from sample
              settngs.errorPlacement = function (error, element) {
                  // Set positioning based on the elements position in the form
                  var elem = $(element);
      
      
                  // Check we have a valid error message
                  if (!error.is(':empty')) {
                      // Apply the tooltip only if it isn't valid
                      elem.filter(':not(.valid)').qtip({
                          overwrite: false,
                          content: error,
                          position: {
                              my: 'center left',  // Position my top left...
                              at: 'center right', // at the bottom right of...
                              viewport: $(window)
                          },
                          show: {
                              event: false,
                              ready: true
                          },
                          hide: false,
                          style: {
                              classes: 'qtip-red' // Make it red... the classic error colour!
                          }
                      })
                      // If we have a tooltip on this element already, just update its content
                      .qtip('option', 'content.text', error);
                  }
      
                  // If the error is empty, remove the qTip
                  else { elem.qtip('destroy'); }
              };
      
              settngs.success = $.noop;
          }
      });
      

      【讨论】:

      • 这很好用,但似乎没有在我的 mvc 项目中应用类:'qtip-red'。我总是得到黄色?任何想法为什么会这样做?
      【解决方案4】:

      找到了答案...发布以供参考。

      1) 首先,找到微软提供的脚本jquery.validate.unobtrusive.js

      2) 其次,在脚本中找到 function validationInfo(form) 并将 options 结构中的 errorPlacement 指令替换为 qTip 提供的指令,或任何你的选择。

      3) 样式和您希望更改验证处理方式的其他选项也是如此。

      4) 包括所有必要的文件。

      希望这可以帮助遇到类似问题的人。

      示例代码:

      function validationInfo(form) {
          var $form = $(form),
              result = $form.data(data_validation);
      
          if (!result) {
              result = {
                  options: {  // options structure passed to jQuery Validate's validate() method
                      //errorClass: "input-validation-error",
                      errorClass: "error",
                      errorElement: "span",
                      //errorPlacement: $.proxy(onError, form),
                      errorPlacement: function (onError, form) {
                          var error = onError;
                          var element = form;
                          // Set positioning based on the elements position in the form
                          var elem = $(element),
                              corners = ['left center', 'right center'],
                              flipIt = elem.parents('span.right').length > 0;
      
                          // Check we have a valid error message
                          if (!error.is(':empty')) {
                              // Apply the tooltip only if it isn't valid
                              elem.filter(':not(.valid)').qtip({
                                  overwrite: false,
                                  content: error,
                                  position: {
                                      my: corners[flipIt ? 0 : 1],
                                      at: corners[flipIt ? 1 : 0],
                                      viewport: $(window)
                                  },
                                  show: {
                                      event: false,
                                      ready: true
                                  },
                                  hide: false,
                                  style: {
                                      classes: 'ui-tooltip-red' // Make it red... the classic error colour!
                                  }
                              })
      
                              // If we have a tooltip on this element already, just update its content
                              .qtip('option', 'content.text', error);
                          }
      
                          // If the error is empty, remove the qTip
                          else { elem.qtip('destroy'); }
                      },
                      invalidHandler: $.proxy(onErrors, form),
                      messages: {},
                      rules: {},
                      success: $.proxy(onSuccess, form)
                  },
                  attachValidation: function () {
                      $form.validate(this.options);
                  },
                  validate: function () {  // a validation function that is called by unobtrusive Ajax
                      $form.validate();
                      return $form.valid();
                  }
              };
              $form.data(data_validation, result);
          }
      
          return result;
      }
      

      【讨论】:

      • 感谢上面的提示,但是 jquery.validate.unobtrusive.js 文件中的更改使得即使有错误也可以提交表单。如何恢复出现错误时表单不提交的默认行为?
      • @ Nick-Olsen - 就个人而言,我所做的每次提交都是使用 jQuery Ajax,在进行 Ajax 调用之前,我会像这样明确地验证表单:if (!$(this).valid() ) 返回假;但是,请注意,自从我第一次发布此解决方案以来,我进行了改进,解决了我在这个特定场景中遇到的一些问题......我会将其添加为另一个答案,以便您查看。
      【解决方案5】:

      有了MantisimoAJC 的答案(感谢他),我编写了以下脚本,没问题,它可以正常工作,但jquery.validate.unobtrusive.js 在每个提交表单中都会抛出如下错误:

      $(document).ready(function () {
          var $forms = $.data($('form')[0], 'validator');
          if ($forms == undefined) return;
          var settngs = $forms.settings;
          settngs.errorPlacement = function (error, inputElement) {
              var element = inputElement;
              var elem = $(element),
                  corners = ['left center', 'right center'],
                  flipIt = elem.parents('span.right').length > 0;
              if (!error.is(':empty')) {
                  elem.filter(':not(.valid)').qtip({
                      overwrite: false,
                      content: error,
                      position: {
                          my: corners[flipIt ? 0 : 1],
                          at: corners[flipIt ? 1 : 0],
                          viewport: $(window)
                      },
                      show: {
                          event: false,
                          ready: true
                      },
                      hide: false,
                      style: {
                          classes: 'qtip-red',
                      }
                  })
                  .qtip('option', 'content.text', error);
              }
              else { elem.qtip('destroy'); }
          };
      });
      

      我已经使用 MVC 5 和 qtip 2.2.0 进行了测试

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-14
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 2012-08-31
        • 2012-10-05
        • 2011-02-16
        相关资源
        最近更新 更多