使用 asp.net 核心移除必需的验证
Remove required validation using asp.net core
我有一个客户端需要在表单上使用两个按钮。保存未完成表格进度的一种。所以这个表单仍然需要验证字段,但只会忽略所需的验证。另一个按钮需要 运行 包含必填字段的完整验证。
我正在使用股票标准 asp.net 核心项目,我认为它使用 jquery-validation-unobtrusive 并且基于视图模型。
我想要做的是在单击 "Save Progress" 按钮时删除所有必需的验证并提交表单。但是 none 我在堆栈溢出或互联网上找到的代码适用于我的场景。
我试过:
<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;
}
}
以上两次尝试都成功找到并删除了规则,但是当提交表单时,相关字段的验证仍然失败。
我很困惑,不知道如何进行。
使用您的代码禁用了客户端验证。为了让它发挥作用,您有两种选择。第一个选项是从您的模型中删除 required 。第二种是删除服务器端验证并编写自己的代码以检查提交的值。
// Remove this.
if (!ModelState.IsValid)
{
return View(model);
}
您可以像这样进行自定义验证。
if (boolean expression)
{
ModelState.AddModelError("Property", "Error message.");
return View(model);
}
将布尔表达式替换为您要进行的检查,将 属性 替换为未通过验证的 属性 名称,并将错误消息替换为您要显示的消息。
在客户端更改 required
规则不会影响服务器端验证。您的 [Required]
属性验证仍在模型绑定过程中执行,因此 ModelState
将无效,并且您需要手动检查每个 属性 以确定其是否无效,因为 [Required]
属性,或者因为您的其他验证属性之一。
此外,您将需要重新添加所有规则(或 re-parse $.validator
)以获得正常提交的客户端验证。
相反,在您的视图模型中包含 bool
属性,以便您可以使用条件 [RequiredIf]
属性(您可以使用 foolproof attribute, or the one in 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();
});
如果您使用 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>
这样您可以更好地控制验证。
更好的方法是在服务器端使用模式 pop-ups 等进行验证
我有一个客户端需要在表单上使用两个按钮。保存未完成表格进度的一种。所以这个表单仍然需要验证字段,但只会忽略所需的验证。另一个按钮需要 运行 包含必填字段的完整验证。
我正在使用股票标准 asp.net 核心项目,我认为它使用 jquery-validation-unobtrusive 并且基于视图模型。
我想要做的是在单击 "Save Progress" 按钮时删除所有必需的验证并提交表单。但是 none 我在堆栈溢出或互联网上找到的代码适用于我的场景。
我试过:
<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;
}
}
以上两次尝试都成功找到并删除了规则,但是当提交表单时,相关字段的验证仍然失败。
我很困惑,不知道如何进行。
使用您的代码禁用了客户端验证。为了让它发挥作用,您有两种选择。第一个选项是从您的模型中删除 required 。第二种是删除服务器端验证并编写自己的代码以检查提交的值。
// Remove this.
if (!ModelState.IsValid)
{
return View(model);
}
您可以像这样进行自定义验证。
if (boolean expression)
{
ModelState.AddModelError("Property", "Error message.");
return View(model);
}
将布尔表达式替换为您要进行的检查,将 属性 替换为未通过验证的 属性 名称,并将错误消息替换为您要显示的消息。
在客户端更改 required
规则不会影响服务器端验证。您的 [Required]
属性验证仍在模型绑定过程中执行,因此 ModelState
将无效,并且您需要手动检查每个 属性 以确定其是否无效,因为 [Required]
属性,或者因为您的其他验证属性之一。
此外,您将需要重新添加所有规则(或 re-parse $.validator
)以获得正常提交的客户端验证。
相反,在您的视图模型中包含 bool
属性,以便您可以使用条件 [RequiredIf]
属性(您可以使用 foolproof attribute, or the one in 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();
});
如果您使用 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>
这样您可以更好地控制验证。
更好的方法是在服务器端使用模式 pop-ups 等进行验证