ModelState.IsValid 在视图上访问时始终为真

ModelState.IsValid always true when accessed on View

通过遵循 this 我得到了 ModelState.IsValid ins jquery 代码。但它总是正确的,我可以在我的页面上看到错误。 我想要实现的是在提交表单时显示加载。我使用了 onclick 提交事件。即使页面上存在验证错误,它也会显示加载。在这种情况下,我不想显示加载。我也尝试使用 FormSubmit 事件,但结果相同。

我的 ViewModel 正在 DataAnnotations 进行验证,表单处于局部视图中。有什么建议可以成功实现此加载消息吗?

这是我的表格

@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { @id = "frmFlightSearch", onsubmit = "CheckModalErros()" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(false)
......
<div class="row" style="margin-bottom:10px;margin-top:10px;">
    <div class="col-lg-3 pull-right">
        <div class="form-group-sm">
            <button id="btnSubmit" type="submit" class="btn btn-sm btn-primary pull-right">
                Search Flights
                <span class="glyphicon glyphicon-plane"></span>
            </button>
        </div>
    </div>
</div>
}

如果您使用 ajax 调用使用局部视图加载表单,则在成功回调时执行如下操作:

$.ajax({
     success: function(data){
                 $('#DivId').html(data);
                 $.validator.unobtrusive.parse($("#FormId"));
             }
});

这将解析您的表单验证,当您点击提交并且模型无效时,您的表单将显示验证消息。

希望对您有所帮助。

编辑:

正如您在点击时所说的,您需要检查以下代码行:

if($('#FormId).Valid())
{
   $('#Loader').show(); //show loader if form is valid.
}
else
{
   e.preventDefault(); // prevent default event if form is not valid.
}

It shows loading even if there are validation errors on page. I don't want show loading in this case.

添加此事件处理程序:

$("#frmFlightSearch").bind("invalid-form.validate", function () {
    // hide 'loading' 
});

这将在您的客户端验证失败时触发,您可以隐藏您为 'loading' 进度显示的内容。

如果客户端验证失败,则无论如何都不会 post(使用 asp.net mvc + jquery 验证)。