使用 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 表单所需的验证器?