MVC 4 - jQuery和必填字段

时间:2014-03-06 00:32:25

标签: jquery asp.net-mvc asp.net-mvc-4

我对此非常陌生,所以我确定这是否是做这样事情的最佳方法。基本上,我有一个搜索页面。该页面包含两个下拉列表,一个选择要搜索的内容(例如设备名称,接口名称等),另一个用于选择搜索操作符(例如“开头”,“包含”,“等于”)。我认为我最好开始查看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" />
}

2 个答案:

答案 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');