我对此非常陌生,所以我确定这是否是做这样事情的最佳方法。基本上,我有一个搜索页面。该页面包含两个下拉列表,一个选择要搜索的内容(例如设备名称,接口名称等),另一个用于选择搜索操作符(例如“开头”,“包含”,“等于”)。我认为我最好开始查看jquery,以及在内置验证的MVC中使用。这导致我在模型中需要所有字段。
我还采取了为每种类型的搜索项目放置文本框并隐藏除“SearchIn”下拉列表中与所选项目对应的文本框之外的所有文本框的方法。
这一切都正常,但是,因为每个文本框都启用了验证,如果我没有在SearchIn下拉列表中选择默认选项(“设备名称”),我选择“接口名称”,然后设置“DeviceName”TextBox,并显示“InterfaceName”文本框,在“InterfaceName”文本框中键入一个值并按搜索,它不会去任何地方,因为即使其他文本框被隐藏,它们仍然需要它们的价值。
如何禁用隐藏的特定元素的验证?
我模型中的所有字段都声明为[必需]:
[Required]
[Display(Name = "Device ID")]
public int DeviceId { get; set; }
[Required]
[Display(Name = "Interface ID")]
public int InterfaceId { get; set; }
[Required]
[Display(Name = "InterfaceDeviceId")]
public int InterfaceDeviceId { get; set; }
[Required]
[Display(Name="Device")]
public string DeviceName { get; set; }
[Required]
[Display(Name = "Interface")]
public string InterfaceName { get; set; }
[Required]
[Display(Name = "MAC Address")]
public string MACAddress { get; set; }
[Required]
[Display(Name = "IPv4 Address")]
public string IPv4Address { get; set; }
[Required]
[Display(Name = "IPv4 Subnet Mask")]
public string IPv4SubnetMask { get; set; }
[Required]
[Display(Name = "CIDR Notation")]
public string CIDR { get; set; }
我的观点如下:
@model FindDevice.Models.DeviceInterfaceModel
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<script type="text/javascript">
$(document).ready(function () {
$('input[type=text]').hide();
var selectedOption = $('#SearchIn').find(':selected').val();
$('#' + selectedOption).show();
$('.field-validation-valid').hide();
$('#SearchIn').change(function () {
var selectedOption = $('#SearchIn').find(':selected').val();
$('input[type=text]').hide();
$('#' + selectedOption).show();
});
});
</script>
<h2>Define your Search Query</h2>
@using (Html.BeginForm("PerformSearch", "Search", FormMethod.Post))
{
@Html.ValidationSummary(true)
@Html.DropDownList("SearchIn")
@Html.DropDownList("SearchOperators");
@Html.TextBoxFor(m => m.DeviceName);
@Html.ValidationMessageFor(m => m.DeviceName)
@Html.TextBoxFor(m => m.InterfaceName);
@Html.ValidationMessageFor(m => m.InterfaceName)
@Html.TextBoxFor(m => m.MACAddress);
@Html.ValidationMessageFor(m => m.MACAddress)
@Html.TextBoxFor(m => m.IPv4Address);
@Html.ValidationMessageFor(m => m.IPv4Address)
@Html.TextBoxFor(m => m.IPv4SubnetMask);
@Html.ValidationMessageFor(m => m.IPv4SubnetMask)
@Html.TextBoxFor(m => m.CIDR);
@Html.ValidationMessageFor(m => m.CIDR)
@Html.TextBox("SearchString")
<input type="submit" value="Search" />
}
答案 0 :(得分:0)
我相信隐藏的输入仍然会被验证,但是如果你禁用了输入,它就不会被验证。
// DISABLE AND HIDE
$("#").prop('disabled', true);
$("#").hide();
// ENABLE AND SHOW
$("#").prop('disabled', false);
$("#").show()
尝试这样的事情
答案 1 :(得分:0)
您可以禁用任何控件以防止它们通过jquery进行验证。但通过这样做,您将无法通过提交表单中的已禁用字段进行发布。
如果您不需要将它们发布到控制器,您可以像@BRomine已经回答的那样禁用它们。
$("selector").hide().prop('disabled', true);
如果您仍想将它们发送到控制器,可以从jquery验证器中删除它们。
要删除它们,您可以使用ignore
选项。
您可以检查以下代码,以防止隐藏输入被验证:
$("#myForm").validate({
ignore: ":hidden"
});
或者你甚至可以通过添加类来忽略它们......
$("#myForm").validate({
ignore: ".ignore"
});
$("selector").hide().addClass('ignore');