2010-12-03 27 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

私はこの問題に実行していますよ。本当に多くの人々がこれに遭遇していないことに驚いています! –

+0

また、jqueryバリデーターはコンテンツを "トリム"します。末尾のスペースと改行はカウントされません – nuander

答えて

-5

サーバーを削除し、クライアント側の検証のみを保持します。データベースに新しい行= 1つの文字 にHTMLの新しい行で = 3文字 だから、uが一度に一つだけを維持する必要があります。 またはこれは、クライアント側のソリューションではありませんが

+1

サーバの検証を削除しますか?あなたは冗談でなければなりません、そうですか? tamperdataのような簡単なことを試みたことがありますか? =>クライアントの検証だけが、あらゆる種類のハッキングに開放されています。 – grootjans

+0

あなたが信頼できる検証の唯一の種類はserversideです。検証を削除する必要がある場合は、クライアント側の検証でなければなりません。 – Falle1234

2

を設定デシベルの文字を変更し、私は問題のサーバー側を処理することができました。

私は基本的に「\ rを」文字である「エクストラ」の文字を取り除きます。私はこれらがブラウザの文字列の長さに含まれていないと思うか、 "\ n"文字で結合されます。私は、問題の同じ種類accrossに来た

[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... 
} 
+0

優れたアイデアジョン! ViewModel apporachを使用している場合は、次のように調整します。set {ModelName.Comment = value.Length> 0? value.Replace( "\ r"、 ""):string.Empty; } –

1

:C#のと私の場合、ASP.NET MVCで

。これはjavascriptではfield.lengthが文字数を返しますが、1文字は情報を格納するために2バイトを使用できるという事実によるものです。

私の問題は、DB内のVARCHAR2のフィールドだけで情報の4000Bytes、または2000Charactersを格納できるということでした。 簡単に混乱し、この種のフィールドに4000文字を格納できると思います。

あなたの場合、フィールドは1000charsに限らず、1バイトの情報を使用する "標準文字"を使用するのと同じである1000Bytesなので、2000Bytesに制限しますjavascriptの検証を1000charsに保ちます。 もちろん、私は前の答えに反して、文字数のサーバー側の検証を行います。

もちろん私の場合、(私はJqueryを使用していなかった)他の解決策もありますが、特殊文字を2回カウントするように文字カウンタを微調整しました(この問題は改行文字に影響します。 。)

1

私はまた、ジョンBubriskiがやったように、サーバ側のアプローチを取ったが、ASPでそれを実装しました。DefaultModelBinderの拡張機能としてNET MVC、すべてのコントローラのアクションがすぐに利益になるように:

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; 
       } 
      }); 
     }); 

これは間違いなく動作します。

+0

これはjqueryの検証ソリューションではありません。 – tjans

4

jQueryの検証1.9を使用して、このperticular問題が発生しました。サーバー上でASP.NET MVC 3とC#を使用しているため、サーバー上では\ r \ nでしたが、クライアント上では "\ n"でした。 "\ n"は1文字として数えられますが、改行が "\ 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

私は今、私たちは私がヤクブBerezanskiのソリューションのほんの改善をお勧めしたいバリデータ

$.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

にmaxlenを参照することができロビンRidderholtソリューションを拡張。

私は個人的に(これは一般的にサーバー側で処理する)というアイデアは非常に優れています。

サンプルコードの問題点は、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); 
    } 
}