5

Xác nhận độ dài chuỗi của tôi luôn thất bại trên danh sách thả xuống với một giá trị chuỗi.MVC DropDownListFor và StringLength thuộc tính không chơi tốt với nhau

Đây là mô hình của tôi:

[Required(ErrorMessage = "Required")] 
[StringLength(2, MinimumLength = 2)] 
[Display(Name = "Home Address State")] 
public string HomeAddressState { get; set; } 

Đây là quan điểm của tôi:

@Html.DropDownListFor(model => model.HomeAddressState, new SelectList(ViewBag.States, "Value", "Text"), string.Empty) 
@Html.ValidationMessageFor(model => model.HomeAddressState) 

Đây là kết quả html:

<select data-val="true" data-val-length="The field Home Address State must be a string with a minimum length of 2 and a maximum length of 2." data-val-length-max="2" data-val-length-min="2" data-val-required="Required" id="HomeAddressState" name="HomeAddressState"><option value=""></option> 
<option value="CA">California</option> 
<option value="IL">Illinois</option> 
<option value="IN">Indiana</option> 
<option value="OH">Ohio</option> 
</select> 

Không có vấn đề gì tùy chọn được chọn, StringLength xác thực thất bại phía máy khách. Tôi đang làm gì sai?

+1

Tại sao bạn cần xác thực StringLength cho danh sách thả xuống? – Jesse

+1

có lẽ vì xác thực mô hình dữ liệu của ông là (chính xác) độc lập với chế độ xem khách hàng của mình. – bhamlin

+0

bhamlin là chính xác. Tôi sử dụng [StringLength (2, MinimumLength = 2)] để tạo chính xác trường char (2) trong cơ sở dữ liệu của tôi vì tôi đang sử dụng mã đầu tiên. Tôi không muốn đi theo cách thông thạo. –

Trả lời

0

StringLength khớp với quy tắc rangelength trong jquery.validate. Trong trường hợp danh sách lựa chọn, nó sẽ kiểm tra số lượng mục được chọn không phải là độ dài của giá trị được lựa chọn vì vậy nếu bạn viết một quy tắc có độ dài tối thiểu là 1, nó sẽ hoạt động

6

Đây là mã xác nhận hợp lệ. Như bạn có thể thấy, có vẻ như nó áp dụng xác nhận độ dài cho số tùy chọn được chọn, không phải độ dài của tùy chọn. Dường như chỉ áp dụng cho hộp danh sách đa lựa chọn. Loại kỳ quặc, thành thật.

maxlength: function(value, element, param) { 
    return this.optional(element) || this.getLength($.trim(value), element) <= param; 
} 

getLength: function(value, element) { 
    switch(element.nodeName.toLowerCase()) { 
     case 'select': 
      return $("option:selected", element).length; 
     case 'input': 
      if(this.checkable(element)) 
       return this.findByName(element.name).filter(':checked').length; 
    } 
    return value.length; 
} 

Những gì bạn có thể làm là ghi đè lên getLength chức năng chính mình để chỉ trả value.length trực tiếp.

$.validator.prototype.getLength = function (value, element) { 
    return value.length; 
} 
+1

Cảm ơn. Tôi sẽ đặt mã đó ở đâu? –

+0

Bất cứ nơi nào sau khi bạn bao gồm thư viện xác nhận jquery. – bhamlin

+0

Đó là những gì tôi nghĩ, nhưng không có súc sắc. Các hành vi mặc định trumps ghi đè của tôi. Tôi tự hỏi làm thế nào các thư viện xác nhận là thực sự instantiated. Có vẻ như đó là một tải lười. Trong $ (tài liệu) .ready() Tôi truy vấn $ .validator.methods.getLength và nó là null. –

2

Để tránh phá vỡ logic cho các hộp kiểm và nhiều selectboxes, bạn có thể sử dụng:

$.validator.prototype.getLength = function (value, element) { 
    switch (element.nodeName.toLowerCase()) { 
     case 'select': 
      { 
       var attr = $(this).attr('multiple'); 
       // For some browsers, `attr` is undefined; for others, 
       // `attr` is false. Check for both. 
       if (typeof attr !== 'undefined' && attr !== false) { 
        return $("option:selected", element).length; 
       } 
      } 
     case 'input': 
      if (this.checkable(element)) 
       return this.findByName(element.name).filter(':checked').length; 
    } 
    return value.length; 
} 

CẢNH BÁO: Tôi đã thử nghiệm này chỉ trên DropDownFor, vì vậy sử dụng có nguy cơ của riêng bạn ....

Các vấn đề liên quan