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

Posted

技术标签:

【中文标题】使用 asp.net core 删除所需的验证【英文标题】:Remove required validation using asp.net core 【发布时间】:2018-08-28 21:07:49 【问题描述】:

我有一个客户需要表单上有两个按钮。一种保存未完成表格的进度的方法。所以这个表单仍然需要验证字段,但会忽略所需的验证。另一个按钮将需要运行包含必填字段的完整验证。

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

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

我试过了:

<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
    

     function foo() 
        var settings = $('#Registration').validate().settings;
        for (var i in settings.rules) 
            delete settings.rules[i].required;
        
 

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

我很困惑,不知道如何继续。

【问题讨论】:

请分享一个完整的代码示例(有服务器端代码,ViewModels 吗?) 澄清:我在禁用客户端验证时仍然遇到问题。我将能够处理服务器端,但我不确定为什么我无法成功禁用客户端。 【参考方案1】:

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

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

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

然后您的模型将包含

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();
);

【讨论】:

我还不能禁用客户端验证。我相信我可以对服务器端进行排序,但它仍然没有发布,因为它没有通过客户端验证。关于我在做错客户端的任何想法?我喜欢你的接近处理服务器端,所以感谢你到目前为止的帮助。 我的方法同时处理客户端和服务器端验证:) 甚至不要尝试在validator 中删除/添加规则。 哦,对了,我想我完全误解了库中是如何处理验证的。什么是流量?我最初可以成功发布错误但当然模型状态无效,因此再次返回视图。现在我不能发布,直到错误得到修复 按照答案去做就好了:)【参考方案2】:

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

// Remove this.
if (!ModelState.IsValid)

    return View(model);

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

if (boolean expression)

    ModelState.AddModelError("Property", "Error message.");
    return View(model);

将布尔表达式替换为您要进行的检查,将属性替换为验证失败的属性名称,并将错误消息替换为您要显示的消息。

【讨论】:

我还不能禁用客户端验证。我相信我可以对服务器端进行排序,但它仍然没有发布,因为它没有通过客户端验证。关于我在客户端做错了什么的任何想法。 在这种情况下,我会从属性中删除所需的属性,然后使用 javascript 或服务器端自定义验证或创建新的 ViewModel 以满足您的需求【参考方案3】:

如果您使用的是 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>

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

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

【讨论】:

问题被标记为 asp.net-mvc - 不是网络表单 - 这与问题无关

以上是关于使用 asp.net core 删除所需的验证的主要内容,如果未能解决你的问题,请参考以下文章

启用/禁用使用 JQuery 禁用输入的 ASP.NET Web 表单所需的验证器?

将 Asp.Net Core 1 转换为 Core 2 后 Jwt 无法正常工作

第16章 使用ASP.NET Core Identity

如何在 ASP.NET Core 中使用 npm

ASP.NET Core

Blazor——Asp.net core的新前端框架