将显示FluentValidation消息,但无论如何都会提交表单

时间:2015-09-24 21:03:18

标签: asp.net-mvc asp.net-mvc-4 fluentvalidation

将MVC4与FluentValidation一起使用。我有一个有两个规则的字段。 NotEmpty规则按预期工作。 “匹配”规则似乎触发,但无论如何都会提交表单,即使验证消息弹出就好像它验证失败一样。

我有以下视图模型和验证器:

public class ImpactedEntityViewModelValidator : AbstractValidator<ImpactedEntityViewModel>
{
    public ImpactedEntityViewModelValidator()
    {
        RuleFor(x => x.ImpactedEntityDescription)
            .Matches("[a-zA-Z0-9/ ]{1,}").WithMessage("Description can only contain letters, numbers, '/', and spaces.")
            .NotEmpty().WithMessage("Description is required.");
    }
}

[Validator(typeof(ImpactedEntityViewModelValidator))]
public class ImpactedEntityViewModel
{
    public int? ImpactedEntityLUID { get; set; }

    [Display(Name = "Impacted Entity Description")]
    public string ImpactedEntityDescription { get; set; }

    public bool? Deleted { get; set; }
}

查看:

@model ChangeControlForm.Models.ImpactedEntityViewModel

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    @Html.EditorFor(model => model)

    <p>
        <input type="submit" value="Create" class="btn btn-default" />
    </p>
}

已添加到Global Application_Start:

FluentValidation.Mvc.FluentValidationModelValidatorProvider.Configure();

我不确定这是怎么回事。如果字段留空,它将无法按预期提交。如果我输入&#34;%&#34;例如,将弹出“匹配”规则的消息,但之后会立即提交并写入记录。我有什么遗失可能会导致这种情况吗?

谢谢。

Per Michael Crook的回答:

这解决了这个问题:

$("form").submit(function () {
    var form = $(this);
    if (form.valid()) {
        // do valid stuff
    }
    else {
        return false;
    }
});

Per LeftyX的回答:

检查了我的Nuget包,jQuery有了更新。将其更新到2.1.4修复了问题,我不需要额外检查提交。

谢谢大家。

3 个答案:

答案 0 :(得分:2)

您不必自己进行验证检查:

$("form").submit(function () {
    var form = $(this);
    if (form.valid()) {
        // do valid stuff
    }
    else {
        return false;
    }
});

我的意思是,你可以,但可能你已经拥有了所需的一切。

如果您签入Scripts文件夹,则应该:

jquery.validate.js
jquery.validate.unobtrusive.js

jquery.unobtrusive-ajax.js (this is only needed if you're POSTing ajax)

并且您BundleConfig已经捆绑了客户端验证所需的脚本:

bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
    "~/Scripts/jquery.unobtrusive*",
    "~/Scripts/jquery.validate*"));

默认模板不会自动添加对该包的引用,但您只需添加以下内容即可添加:

@Scripts.Render("~/bundles/jqueryval")  

到您的_Layout.cshtml或您需要客户端验证的任何地方。

如果你检查表单的html,你会看到你的输入:

<input name="ImpactedEntityDescription" class="text-box single-line" id="ImpactedEntityDescription" type="text" value="" data-val="true" data-val-required="Description is required." data-val-regex-pattern="[a-zA-Z0-9/ ]{1,}" data-val-regex="Description can only contain letters, numbers, '/', and spaces.">

设置了所有不显眼的属性:

data-val="true" 
data-val-required="Description is required." 
data-val-regex-pattern="[a-zA-Z0-9/ ]{1,}" 
data-val-regex="Description can only contain letters, numbers, '/', and spaces."

jquery.validate.js在为你求和之前检查表格(第404行):

// http://jqueryvalidation.org/Validator.form/
form: function() {
    this.checkForm();
    $.extend( this.submitted, this.errorMap );
    this.invalid = $.extend({}, this.errorMap );
    if ( !this.valid() ) {
        $( this.currentForm ).triggerHandler( "invalid-form", [ this ]);
    }
    this.showErrors();
    return this.valid();
},

检查 nuget 包是否已更新。

答案 1 :(得分:1)

你可能会发现FluentValidation(我只用过服务器端验证,而不是客户端)没有能力禁用发布。您可以尝试使用jquery在表单中搜索验证错误类,然后自己禁用该按钮。

答案 2 :(得分:0)

除了上面提到的可能原因之外,即使表单仍然无效,视图中的这一行也会在用户点击您的提交按钮后立即提交表单:

HtmlHelper.ClientValidationEnabled = false;