2012-06-28 15 views
8

Tengo este problema en mi aplicación asp.net mvc.Los nuevos caracteres de línea en el área de texto aumentan la longitud del texto en C#

En uno de mis modelos hay un campo "Descripción". La columna de la base de datos para este campos está configurada en NVarchar(300).

En mi opinión, estoy creando un área de texto de la siguiente manera.

@Html.TextAreaFor(m => m.Description, new { maxlength = "300" }) 

estoy usando "jquery.validate.unobtrusive.min.js" para la validación del lado del cliente. Por lo tanto, cuando el usuario escribe en el área de texto y la longitud del contenido supera los 300 caracteres, muestra el mensaje "Ingrese no más de 300 caracteres".

Todo funciona bien hasta que llegue el siguiente sceanario. El usuario ingresa los siguientes datos en el área de texto.

f 
f 
f 
f 
f 
f 
f 
f 
sdfa 

(este contenido tiene 8 nuevas líneas)

Según validación "discreto" Este contenido se longitud 300 (contando cada nueva línea "\ n" como un solo carácter) por lo que la validación pasa y publicaciones de la página de vuelta.

En mi código C#, debido a la codificación, el mismo contenido se convierte en fo longitud 308 (contando cada nueva línea "\ r \ n" como 2 caracteres) que a su golondrina error en la operación de base de datos, ya que sólo permite 300 caracteres.

Si alguien dice que debería tener el atributo StringLength en esta propiedad en particular, tengo la siguiente razón para no tenerlo.

Si pongo este atributo, la validación del lado del cliente no ocurre para esta propiedad en particular, va al servidor y dado que el modelo no es válido, vuelve a la página con un mensaje de error.

Por favor, ¿cuál es la posible solución?

Respuesta

3

Puede cambiar el comportamiento de getLength en la validación del cliente para contar dos veces nuevas líneas agregando lo siguiente a su javascript después de haber incluido jquery.validate.js. Esto hará que los métodos de longitud del lado del servidor y del lado del cliente coincidan permitiéndote usar el atributo StringLength (supongo que tu problema con StringLength fue que los métodos de validación del servidor y del cliente eran diferentes).

$.validator.prototype._getLength = $.validator.prototype.getLength; 
$.validator.prototype.getLength = function (value, element) { 
// Double count newlines in a textarea because they'll be turned into \r\n by the server. 
    if (element.nodeName.toLowerCase() === 'textarea') 
     return value.length + value.split('\n').length - 1; 
    return this._getLength(value, element); 
}; 
+0

La división no funcionó para mí. Tuve un problema con los saltos de línea finales, que no se contabilizaron con su método. Utilicé esto en su lugar: '// reemplaza los caracteres de nueva línea con 2 espacios para que el recuento coincida con el del servidor. var replacedValue = value.replace (/ (\ n)/gm, ""); return replacedValue.length; ' Nota: el bloque de código de alguna manera muestra solo un espacio donde debería haber dos. – Ben

5

Después de tomar una mirada más cercana a la solución por @ Chris, he encontrado que esto causaría un bucle sin fin para cualquier control de distinta área de texto con el atributo @maxlength.
Además, encontré que usar value (= el valor del área de texto pasado al validador) ya tendría cortados los saltos de línea inicial y final, lo que significa que la operación de la base de datos aún falló cuando intentó guardar el texto que contenía esos saltos de línea.
Así que aquí está mi solución:

(function ($) { 
    if ($.validator) { 
     //get the reference to the original function into a local variable 
     var _getLength = $.validator.prototype.getLength; 

     //overwrite existing getLength of validator 
     $.validator.prototype.getLength = function (value, element) { 

      //double count line breaks for textareas only 
      if (element.nodeName.toLowerCase() === 'textarea') { 

       //Counts all the newline characters (\r = return for macs, \r\n for Windows, \n for Linux/unix) 
       var newLineCharacterRegexMatch = /\r?\n|\r/g; 

       //use [element.value] rather than [value] since I found that the value passed in does cut off leading and trailing line breaks. 
       if (element.value) { 

        //count newline characters 
        var regexResult = element.value.match(newLineCharacterRegexMatch); 
        var newLineCount = regexResult ? regexResult.length : 0; 

        //replace newline characters with nothing 
        var replacedValue = element.value.replace(newLineCharacterRegexMatch, ""); 

        //return the length of text without newline characters + doubled newline character count 
        return replacedValue.length + (newLineCount * 2); 
       } else { 
        return 0; 
       } 
      } 
      //call the original function reference with apply 
      return _getLength.apply(this, arguments); 
     }; 
    } 
})(jQuery); 

He probado esto en Chrome y algunas versiones de IE y funcionó bien para mí.

Cuestiones relacionadas