2010-12-03 2 views
13

Я использую jQuery.validate v 1.6.0 для проверки моих форм.jQuery validate textarea maxlength ошибка

Одно из полей моей базы данных ограничено 1000 символами. Я добавил проверку в соответствующей текстовой, как это:

В заголовке моей страницы, добавить

$('form.validate').validate(); 

Внутри моей страницы, я заявляю:

<form method="post" class="validate" action="Save"> 
    <textarea name="description" minlength="15" maxlength="1000" id="description" class="required"></textarea> 
    <input type="submit" value="Save">  
</form> 

У меня вопрос сталкивается с тем, что jQuery, по-видимому, подсчитывает количество символов, участвующих в «новой строке» по-разному, как моя база данных.

Когда я печатаю точно 1000 символов без новых строк, все идет хорошо, и валидация работает. Если я набираю 1000 символов с некоторыми новыми строками, jQuery разрешает POST, но моя база данных отказывается от вставки/обновления, потому что данные слишком большие.

Любые советы были бы оценены.

+0

Я бег в этот вопрос. Действительно удивился, что больше людей не сталкиваются с этим! – 2011-11-29 16:08:43

+0

Также обратите внимание, что валидатор jquery «обрезает» содержимое, например. конечные пробелы и фиды строк не учитываются – nuander 2013-03-06 15:41:12

ответ

-5

Откажитесь от проверки сервера и проверьте его только на стороне клиента. В html new line = 3 char В базе данных новая строка = 1 char Так что вам нужно оставлять только по одному. или изменить настройку char db

+1

Проверка валида сервера? Вы, должно быть, шутите, не так ли? Вы когда-нибудь пробовали что-то простое, как тампердата? => только проверка клиента - это открытая дверь для всех видов взлома. – grootjans 2011-01-04 22:20:19

+0

Единственный вид проверки, которому вы можете доверять, является сервером. Если вы откажетесь от какой-либо проверки, она должна быть проверена клиентом. – Falle1234 2011-11-18 08:04:48

2

Хотя это не решение на стороне клиента, я смог обработать серверную проблему.

Я в основном выделяю «лишние» символы, которые являются символами «\ r». Я предполагаю, что они не учитывают длину строки в браузере или объединяются как с символами «\ n».

В моем случае, ASP.NET MVC с C#:

[HttpPost] 
public ActionResult SetComment(int id, string comment) 
{ 
    // Yep, the browser can insert newlines as "\r\n" which overflows the allowed number of characters! 
    comment = comment.Replace("\r", ""); 

    // More code... 
} 
1

я наткнулся на такой же вопрос. это связано с тем, что в javascript field.length возвращает количество символов, но один символ может использовать 2 байта для хранения информации.

Моя проблема заключалась в том, что поле VARCHAR2 в БД может хранить только 4000 бит информации, или 2000 символов. Мы легко смущаемся и думаем, что можем хранить 4000 символов в таких полях.

Я думаю, что в вашем случае поле не ограничивается 1000chars, но 1000 байт, которые, как оказалось, будут одинаковыми, вы используете только «стандартные символы», которые используют один байт информации, поэтому я бы восстановил предел до 2000 бит и сохраните проверку JavaScript на 1000chars. Тогда, конечно, я бы пошел против предыдущего ответа и проверил проверку на стороне сервера на количество символов.

Конечно, у вас есть другие решения, например, в моем случае (я не использовал Jquery), я изменил счетчик персонажей, чтобы засчитывать дважды каждый специальный символ (эти проблемы влияют на символы новой строки, но также и акценты ... .)

1

Я также взял подход на стороне сервера, как это сделал Джон Бубриски, но реализовал его в ASP.NET MVC в качестве дополнения к DefaultModelBinder, так что все действия контроллера выиграют сразу:

public class NewlinesNormalizingModelBinder : DefaultModelBinder 
{ 
    protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) 
    { 
     base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 

     // Note: if desired, one could restrict the conversion to properties decorated with [StringLength]: 
     // && propertyDescriptor.Attributes.OfType<StringLengthAttribute>().Any() 
     if (propertyDescriptor.PropertyType == typeof(string)) 
     { 
      var originalString = propertyDescriptor.GetValue(bindingContext.Model) as string; 
      if (!string.IsNullOrEmpty(originalString)) 
      { 
       var stringWithNormalizedNewlines = originalString.Replace("\r\n", "\n"); 
       propertyDescriptor.SetValue(bindingContext.Model, stringWithNormalizedNewlines); 
      } 
     } 
    } 
} 

Тогда при запуске приложения:

ModelBinders.Binders.DefaultBinder = new NewlinesNormalizingModelBinder(); 
-1

Если это происходит только в том случае <textarea>, пожалуйста, используйте следующий код:

$(document).ready(function() { 
      $("input[type=submit]").live("click", function (e) { 
       if ($(textarea).val().length > 1000) { 
        e.preventDefault(); 
        return false; 
       } 
      }); 
     }); 

Это определенно сработает.

4

Я столкнулся с этой проблемой, используя jQuery Validate 1.9. Поскольку я использую ASP.NET MVC 3 и C# на разрыве строки сервера, это «\ r \ n» на сервере, но «\ n» на клиенте. Когда я подтвердил свое текстовое поле на клиенте, проверка не завершилась неудачей, потому что «\ n» подсчитывается только как один символ, но когда текст переходит к проверке на сервере, где строки являются «\ r \ n», проверка не удалась.

Мой soultion к этой проблеме было переопределить JQuery метод проверки «rangelengt», потому что я также имеют минимальную длину, определяемую:

$.validator.addMethod('rangelength', function (value, element) { 
     var maxlen = parseInt($(element).attr('data-val-length-max')); 
     if (maxlen > 0) { 
      var remaining = (maxlen - (parseInt($(element).val().replace(/(\r\n|\n|\r)/gm, '\r\n').length))); 
      if (remaining < 0) { 
       return false; 
      } 
     } 

     return true; 
    }); 

Так что этот код на самом деле, чтобы получить значение MAXLENGTH и затем получить значение из этого элемента, а затем заменяет все символы «\ n» на «\ r \ n», чтобы получить одинаковое количество символов, что и сервер.

2

Выражаю Робин Ridderholt решение, теперь мы можем обратиться MAXLEN к считывающему

$.validator.addMethod('extMaxLength', function (value, element, maxlen){ 
      if (maxlen > 0) { 
       var remaining = (maxlen - (parseInt($(element).val().replace(/(\r\n|\n|\r)/gm, '\n').length, 10))); 
       if (remaining < 0) { 
        return false; 
       } 
      } 
      return true; 
     }); 
0

Я хотел бы предложить только улучшение решения Якуб Berezanski «s.

Я лично считаю, что его идея (обработки этого вообще на стороне сервера) очень хорошая.

Только одна проблема с его примером кода может заключаться в том, что модель в конечном итоге уже недействительна во время переопределения метода BindProperty - если это вызвано только той длиной поля, которую мы исправляем там.

Поэтому мое рационализаторское предложение к его решению является применить ту же логику, уже в GetPropertyValue переопределения, - который выполняет до проверки:

public class NewlinesNormalizingModelBinder : DefaultModelBinder 
{ 
    protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder) 
    { 
     // Note: if desired, one could restrict the conversion to properties decorated with [StringLength]: 
     // && propertyDescriptor.Attributes.OfType<StringLengthAttribute>().Any() 
     if (propertyDescriptor.PropertyType == typeof(string)) 
     { 
      string originalString = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue; 

      if (!string.IsNullOrEmpty(originalString)) return originalString.Replace("\r\n", "\n"); 
     } 

     return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder); 
    } 
} 
Смежные вопросы