使用asp.net核心删除所需的验证

时间:2018-03-20 06:32:34

标签: jquery asp.net asp.net-mvc unobtrusive-validation

我有一个客户端需要表单上的两个按钮。一个可以保存未完成表单的进度。因此,此表单仍需要验证字段,但只会忽略所需的验证。另一个按钮需要运行包含必填字段的完整验证。

我正在使用股票标准的asp.net核心项目,我相信它使用jquery-validation-unobtrusive并且基于视图的模型。

我想要做的是"保存进度"单击按钮以删除所有必需的验证并提交表单。但是,我在堆栈溢出或互联网上找到的代码都没有适用于我的场景。

我试过了:

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                showSnackBar(query.toString());
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                return false;
            }
        });

<div class="form-group">
            <input id="Progress" type="submit" value="Save Progress" onclick="foo()" class="btn btn-default" />
        </div>

 function foo() {

        $('#FamilyName').rules("remove", "required");


        return true
    }

以上两次尝试都成功找到并删除了规则,但是在提交表单时,相关字段的验证仍然失败。

我很难过,不知道该怎么办。

3 个答案:

答案 0 :(得分:1)

更改客户端上的required规则不会影响服务器端验证。您的[Required]属性验证仍在模型绑定过程中执行,因此ModelState将无效,您需要检查每个属性以确定其是否因[Required]属性而无效,或者因为你的其他验证属性之一。

此外,您需要再次添加所有规则(或重新解析$.validator)以获得正常提交的客户端验证。

相反,在视图模型中包含bool属性,以便您可以使用条件[RequiredIf]属性(可以使用foolproof属性,也可以使用{{3}中的属性}})。

然后您的模型将包括

public bool IsDraft { get; set; }
[RequiredIf("IsDraft", false, ErrorMessage = "...")]
public string FamilyName { get; set; }

并在视图中

@Html.HiddenFor(m => m.IsDraft)

@Html.LabelFor(m => m.FamilyName)
@Html.TextBoxFor(m => m.FamilyName)
@Html.ValidationMessageFor(m => m.FamilyName)


<input id="Progress" type="button" value="Save Progress" class="btn btn-default" />
<input id="Final" type="button" value="Save Final" class="btn btn-default" />

以及相关的脚本

$('#Progress').click(function() {
    $('#IsDraft').val('True');
    $(yourForm).submit();
});
$('#Final').click(function() {
    $('#IsDraft').val('False');
    $(yourForm).submit();
});

答案 1 :(得分:0)

使用您的代码可以显示客户端验证。为了使其工作,您有两种选择。第一个选项是从模型中删除所需的。第二种是删除服务器端验证并编写自己的代码以检查提交的值。

// Remove this.
if (!ModelState.IsValid)
{
    return View(model);
}

您可以像这样进行自定义验证。

if (boolean expression)
{
    ModelState.AddModelError("Property", "Error message.");
    return View(model);
}

使用要进行的检查替换布尔表达式,使用未通过验证的属性名称替换属性,并使用要显示的消息的错误消息替换。

答案 2 :(得分:0)

如果您使用ASP,为什么不使用ASP按钮?

<asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="return ValidationCheck();" />

然后脚本是:

<script language="javascript" type="text/javascript">  
      function ValidationCheck() 
{
    var value = $("#TextBox1").val(); 

    if ((value === null) || (value == "")) 
        { 
          alert("Enter text!"); return false; 
        } 
    return true; } 
</script>

这样您就可以更好地控制验证。

更好的方法是在服务器端使用模态弹出窗口等进行验证。