2014-03-06 46 views
0

我對此很新,所以我確定這是做這種事情的最佳方式。基本上,我有一個搜索頁面。該頁面包含兩個下拉菜單,一個選擇要搜索的內容(例如設備名稱,接口名稱等),另一個用於選擇搜索操作符(例如「開始於」,「包含」,「等於」)。我想我最好開始看jquery,以及用於構建在validaton中的MVC。這導致我使我的模型中的所有字段都是必需的。MVC 4 - jQuery和必填字段

我還採取了爲每種類型的搜索項目放置一個文本框,並隱藏除「SearchIn」下拉列表中與所選項目對應的文本框以外的所有文本框的方法。但是,因爲每個文本框都啓用了驗證功能,如果我沒有在SearchIn下拉列表中選擇默認選項(「設備名稱」),並且我選擇了「接口名稱」 ,然後設備「DeviceName」文本框,並顯示「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

我相信,一個隱藏的輸入仍然會被驗證,但如果你禁用一個沒有驗證的輸入。

// DISABLE AND HIDE 
    $("#").prop('disabled', true); 
    $("#").hide(); 

    // ENABLE AND SHOW 
    $("#").prop('disabled', false); 
    $("#").show() 

嘗試是這樣的

0

可以禁用所有的控制,以防止它們被jQuery的驗證。但通過這樣做,您將無法通過提交表單發佈禁用的字段。

如果您不需要將它們發佈到控制器,您可以像@BRomine已經回答的那樣禁用它們。

$("selector").hide().prop('disabled', true); 

如果你仍然想將它們發送到控制器,你可以從jQuery的驗證器中刪除。

要刪除它們,您可以使用ignore選項。 您可以檢查下面的代碼,以防止隱藏的輸入被驗證:

$("#myForm").validate({ 
    ignore: ":hidden" 
}); 

或者你甚至可以通過添加類忽略他們...

$("#myForm").validate({ 
    ignore: ".ignore" 
}); 

$("selector").hide().addClass('ignore');