【问题标题】:Bootstrap validation with MVC?使用 MVC 进行引导验证?
【发布时间】:2014-08-22 23:04:21
【问题描述】:

我一直在看以下网站 - http://bootstrapvalidator.com/getting-started/#release

我喜欢验证。我正在开发一个 MVC 5 应用程序,我正在使用引导程序。我目前在我的模型上使用装饰器来触发验证。

e.e

[Required]
public string FirstName { get; set; }

我的标记如下:

    <div class="col-xs-5">
        @Html.TextBoxFor(model => model.FirstName, new { @class = "form-control input-sm" })
        @Html.ValidationMessageFor(model => model.FirstName)
    </div>

模型上的另一个字段是例如

年龄

[Range(0,150), ErrorMessage="Age field cannot be greater than 150"]
public int Age { get; set; }

所以我希望将年龄错误消息注入到提示中,而不是为我的应用程序中的每个页面重复验证服务器端和客户端

因此,如果用户尝试在没有填写 FirstName 的情况下提交表单,验证消息将被触发。

我真正想要实现的是这样的 - http://bootstrapvalidator.com/settings/#form-container - 所以该字段会触发验证并将错误消息放入 ToolTip - 有没有人用 MVC 做过类似的事情,有没有办法我们可以强制将服务器端验证消息注入到将出现在该工具提示中的错误中?

更新

尝试使用下面的@Tieson 答案 - 目前无法使用。我在页面上添加了包含只能包含 3 个数字的百分比字段的样式。下载 bootstrap unobtrusice 扩展后我的包配置如下:

        var thirdPartyScripts = new ScriptBundle("~/bundles/thirdpartyscripts").Include(
            "~/Scripts/modernizr-*",
            "~/Scripts/jquery-{version}.js",
            "~/Scripts/jquery.validate.js",
            "~/Scripts/jquery.validate.unobtrusive.js",
            "~/Scripts/jquery.form.js",
            "~/Scripts/jquery.blockUI.js",
            "~/Scripts/jquery.autosize.min.js",
            "~/Scripts/bootstrap.js",
            "~/Scripts/jquery.validate.unobtrusive.bootstrap.js",
            "~/Scripts/respond.js",
            "~/Scripts/kendo/kendo.web.min.js",
            "~/Scripts/kendo/kendo.aspnetmvc.min.js",
            "~/Content/ckeditor/ckeditor.js",
            "~/Content/ckeditor/adapters/jquery.js",
            "~/Scripts/knockout-3.1.0.js",
            "~/Scripts/knockout.mapping-latest.js");

        thirdPartyScripts.Orderer = new AsIsBundleOrderer();
        bundles.Add(thirdPartyScripts);

我的视图模型中的百分比字段为:

 [RegularExpression(@"^(?:999|[1-9]?[0-9]?[0-9])$", ErrorMessage = "Does this work")]
        public int Percentage{ get; set; }

我将更新添加到 bootstrap.js 文件,然后在 document.ready 函数中我将更新添加到 setDefaults 验证。我看到的是,如果我在字段中输入有效数字,例如 50,它不会突出显示绿色。如果我输入 4 位数字并远离字段,它会突出显示红色,但字段中不包含 X 图标,它将呈现工具提示错误消息,然后当我再次输入有效数据时,它不会从红色变回。我在 document.ready 中验证器的 setDefaults 中的 showErrors 函数中放置了一个警报('here'),但我没有看到它触发警报?

当我输入无效数据并且该字段变为红色时,屏幕上呈现的 html 是:

<input class="form-control input-validation-error text-danger" data-val="true" data-val-regex="Does this work" data-val-regex-pattern="^(?:999|[1-9]?[0-9]?[0-9])$" id="txtPercentage" name="Percentage" placeholder="Percentage" type="text" value="" aria-invalid="true">

我的cshtml标记如下:

            <div class="row form-group">
                @Html.LabelFor(m => m.Percentage, new { @class = "col-md-3 control-label" })
                <div class="col-md-9">
                    @Html.TextBoxFor(m => m.Percentage, new { @class = "form-control", @placeholder = "Percentage", id = "txtPercentage" })
                </div>
            </div>

我是否也需要在此处向我的标记添加提示?

【问题讨论】:

  • 您是否包含了 Validator js 库?如果是,那么您必须知道表单的 HTML ID 是什么。您可以在@Html.BeginForm() 中设置它,然后在页面末尾:$('#YourFormID').bootstrapValidator();与您的自定义错误消息相关:您可以使用 HTML5 中的数据属性来显示您想要的消息
  • 我想一个选项就是编写 js 来验证表单客户端,仍然保留服务器端验证并在验证摘要中呈现任何进一步的服务器端错误...
  • 是的,在客户端和服务器端验证您的输入始终是一个好习惯,因为如果有人对 JavaScript 足够好并且他们想要损害您的网站,他们可以跳过客户端验证使用 FireBug。
  • @DawoodAwan - 是的,或者他们可以在浏览器中关闭 js :) - 我想我想要避免的是必须在 js 和服务器端重复验证 - 例如年龄字段我正在尝试查看是否有一种方法可以配置引导验证器以获取此错误消息,?
  • 我还不确定,但我认为你可以使用 @Html.ValidationMessageFor() stackoverflow.com/questions/19281415/…

标签: jquery asp.net-mvc twitter-bootstrap validation twitter-bootstrap-3


【解决方案1】:

可以重写jQuery验证器的Default settings

  <script type="text/javascript">
        $.validator.setDefaults({            
            showErrors: function (errorMap, errorList) {
                this.defaultShowErrors();

                // If an element is valid, it doesn't need a tooltip
                $("." + this.settings.validClass).tooltip("destroy");

                // Add tooltips
                for (var i = 0; i < errorList.length; i++) {
                    var error = errorList[i];
                    $(error.element).tooltip({ trigger: "focus" }) // Activate the tooltip on focus
                                    .attr("data-original-title", error.message);
                }
            }
     });
 </script>

这里,errorList 为我们提供了所有未验证的元素。通过使用其error.element 属性,我们可以将工具提示附加到该元素。

【讨论】:

    【解决方案2】:

    我发现结合 SO 的一些答案让我可以使用 Bootstrap 的工具提示代替内联验证消息,同时让我还可以使用 .alert 类的样式。

    首先,我根据这个答案调整了 CSS:Modifying Twitter Bootstrap's Tooltip Colors Based on Position

    /* INFO */
    .tooltip.tooltip-info .tooltip-inner
    {
        color: #31708f;
        background-color: #d9edf7;
        border-color: #bce8f1;
        background-image: -webkit-linear-gradient(top, #d9edf7 0, #b9def0 100%);
        background-image: linear-gradient(to bottom, #d9edf7 0, #b9def0 100%);
        background-repeat: repeat-x;
        border-color: #9acfea;
        filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
    }
    
    .tooltip.tooltip-info.top .tooltip-arrow,
    .tooltip.tooltip-info.top-left .tooltip-arrow,
    .tooltip.tooltip-info.top-right .tooltip-arrow
    {
        border-top-color: #bce8f1;
    }
    
    .tooltip.tooltip-info.bottom .tooltip-arrow,
    .tooltip.tooltip-info.bottom-left .tooltip-arrow,
    .tooltip.tooltip-info.bottom-right .tooltip-arrow
    {
        border-bottom-color: #bce8f1;
    }
    
    .tooltip.tooltip-info.right .tooltip-arrow
    {
        border-right-color: #bce8f1;
    }
    
    .tooltip.tooltip-info.left .tooltip-arrow
    {
        border-left-color: #bce8f1;
    }
    
    
    /* DANGER (ERROR) */
    .tooltip.tooltip-danger .tooltip-inner
    {
        color: #a94442;
        background-color: #f2dede;
        border-color: #ebccd1;
        background-image: -webkit-linear-gradient(top, #f2dede 0, #e7c3c3 100%);
        background-image: linear-gradient(to bottom, #f2dede 0, #e7c3c3 100%);
        background-repeat: repeat-x;
        border-color: #dca7a7;
        filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
    }
    
    .tooltip.tooltip-danger.top .tooltip-arrow,
    .tooltip.tooltip-danger.top-left .tooltip-arrow,
    .tooltip.tooltip-danger.top-right .tooltip-arrow
    {
        border-top-color: #ebccd1;
    }
    
    .tooltip.tooltip-danger.bottom .tooltip-arrow,
    .tooltip.tooltip-danger.bottom-left .tooltip-arrow,
    .tooltip.tooltip-danger.bottom-right .tooltip-arrow
    {
        border-bottom-color: #ebccd1;
    }
    
    .tooltip.tooltip-danger.right .tooltip-arrow
    {
        border-right-color: #ebccd1;
    }
    
    .tooltip.tooltip-danger.left .tooltip-arrow
    {
        border-left-color: #ebccd1;
    }
    
    
    /* WARNING */
    .tooltip.tooltip-warning .tooltip-inner
    {
        color: #8a6d3b;
        background-color: #fcf8e3;
        border-color: #faebcc;
        background-image: -webkit-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);
        background-image: linear-gradient(to bottom, #fcf8e3 0, #f8efc0 100%);
        background-repeat: repeat-x;
        border-color: #f5e79e;
        filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
    }
    
    .tooltip.tooltip-warning.top .tooltip-arrow,
    .tooltip.tooltip-warning.top-left .tooltip-arrow,
    .tooltip.tooltip-warning.top-right .tooltip-arrow
    {
        border-top-color: #faebcc;
    }
    
    .tooltip.tooltip-warning.bottom .tooltip-arrow,
    .tooltip.tooltip-warning.bottom-left .tooltip-arrow,
    .tooltip.tooltip-warning.bottom-right .tooltip-arrow
    {
        border-bottom-color: #faebcc;
    }
    
    .tooltip.tooltip-warning.right .tooltip-arrow
    {
        border-right-color: #faebcc;
    }
    
    .tooltip.tooltip-warning.left .tooltip-arrow
    {
        border-left-color: #faebcc;
    }
    
    
    /* SUCCESS */
    .tooltip.tooltip-success .tooltip-inner
    {
        color: #3c763d;
        background-color: #dff0d8;
        border-color: #d6e9c6;
        background-image: -webkit-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);
        background-image: linear-gradient(to bottom, #dff0d8 0, #c8e5bc 100%);
        background-repeat: repeat-x;
        border-color: #b2dba1;
        filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
    }
    
    .tooltip.tooltip-success.top .tooltip-arrow,
    .tooltip.tooltip-success.top-left .tooltip-arrow,
    .tooltip.tooltip-success.top-right .tooltip-arrow
    {
        border-top-color: #d6e9c6;
    }
    
    .tooltip.tooltip-success.bottom .tooltip-arrow,
    .tooltip.tooltip-success.bottom-left .tooltip-arrow,
    .tooltip.tooltip-success.bottom-right .tooltip-arrow
    {
        border-bottom-color: #d6e9c6;
    }
    
    .tooltip.tooltip-success.right .tooltip-arrow
    {
        border-right-color: #d6e9c6;
    }
    
    .tooltip.tooltip-success.left .tooltip-arrow
    {
        border-left-color: #d6e9c6;
    }
    

    然后我们添加 Bootstrap Unobtrusive Validation 插件:https://www.nuget.org/packages/jquery.validate.unobtrusive.bootstrap/ - 这扩展了 Unobtrusive Validation 插件,以便将 .has-error 等类添加到触发输入最近的 .form-group

    让我烦恼的一个部分是这个;我不得不稍微修改一下 bootstrap.js 文件,从这里:

      $tip
        .detach()
        .css({ top: 0, left: 0, display: 'block' })
        .addClass(placement)
    

    到这里:

      $tip
        .detach()
        .css({ top: 0, left: 0, display: 'block' })
        .addClass(placement)
        .addClass(this.$element.data('tooltip'))
    

    它让工具提示插件读取data- 属性,该属性定义了要应用的工具提示样式。

    最后,稍微修改一下验证器设置:

    $.validator.setDefaults({
        showErrors: function (errorMap, errorList) {
            this.defaultShowErrors();
    
            // destroy tooltips on valid elements                              
            $("." + this.settings.validClass).tooltip("destroy");
    
            // add/update tooltips 
            for (var i = 0; i < errorList.length; i++) {
                var error = errorList[i];
    
                var id = '#' + error.element.id;
                var isInModal = $(id).parents('.modal').length > 0;
    
                $(id)
                    .tooltip({ trigger: 'focus', placement: isInModal ? 'auto right' : 'right', container: isInModal ? false : '.row', html: true })
                    .attr('data-tooltip', 'tooltip-danger')
                    .attr('data-original-title', error.message);
            }
        }
    });
    

    我使用的版本与@VahidN 建议的版本有些不同;我有时使用模式来显示输入表单,并且将容器应用于工具提示不会在模式中正确呈现。如果您的输入可能用于.input-group,则容器是必需的,所以我只使用最接近的.row

    【讨论】:

    • 我在模态窗口中也有表单输入,因此可以为您提供解决方案。你还在你的cshtml中使用Html.ValidationMessageFor吗?
    • $.validator.setDefaults 是否在我希望它工作的页面上的 document.ready 中进入?出于某种原因,我没有在表单字段的工具提示中输入错误 - 它根本没有出现在屏幕上 - 如果我输入不正确的数据,该字段会变为红色 - 但如果数据有效,则不会变为绿色 - 我将更新上面的问题我所看到的
    • 我把它放在一个单独的文件中。不需要准备好。应该不会吧。只要确保它是在所有验证插件之后。
    • 更新了我的问题 - 将尝试将 validator.setDefaults 的 js 移动到一个单独的文件中,并可能将其包含在我的包中?
    • 我发现的最简单的解决方案是“隐藏”验证消息,如下所示: .不理想,但它有效。
    【解决方案3】:

    MVC 框架使用 JQuery 验证。 Razor 视图助手根据模型属性及其属性生成 HTML 数据注释。

    [Required(ErrorMessage="You must enter a username")]
    public string Username {get; set;}
    
    @Html.EditorFor(m => m.Username)
    
    <input type="text" data-val="true" data-val-required="You must enter a username" value="">
    </input>
    <!--Generated placeholder for clientside validator message-->
    

    您必须覆盖编辑器帮助程序以制作引导验证程序特定的 data-* 注释。这里有一篇文章快速介绍您编写自己的自定义 DisplayFor 和 EditorFor 助手:

    http://buildstarted.com/2010/09/10/overriding-displayfor-and-editorfor-to-create-custom-outputs-for-mvc/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-31
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多