2012-04-24 27 views
5

Estoy usando "jQuery Validate discreto" con ASP.NET MVC3 Razor.jQuery Validate Unobtrusive no funciona para TextArea

Tengo una página con un formulario "Comentarios", así:

Modelo

public class CommentModel 
{ 

    [Required] 
    public string Name { get; set; } 

    [Required] 
    [DataType(DataType.EmailAddress)] 
    public string Email { get; set; } 

    [DataType(DataType.Url)] 
    [Display(Name = "Website URL")] 
    public string WebsiteUrl { get; set; } 

    [Required] 
    public string Message { get; set; } 

} 

Ver

@using (Html.BeginForm("AddComment", "Blog", new { @articleID = article.ID })) 
    { 
     <p> 
      @Html.LabelFor(m => m.commentModel.Name) 
      @Html.TextBoxFor(m => m.commentModel.Name) 
      @Html.ValidationMessageFor(m => m.commentModel.Name) 
     </p> 
     <p> 
      @Html.LabelFor(m => m.commentModel.Email) 
      @Html.TextBoxFor(m => m.commentModel.Email) 
      @Html.ValidationMessageFor(m => m.commentModel.Email) 
     </p> 
     <p> 
      @Html.LabelFor(m => m.commentModel.WebsiteUrl) 
      @Html.TextBoxFor(m => m.commentModel.WebsiteUrl) 
      @Html.ValidationMessageFor(m => m.commentModel.WebsiteUrl) 
     </p> 
     <p> 
      @Html.LabelFor(m => m.commentModel.Message) 
      @Html.TextAreaFor(m => m.commentModel.Message) 
      @Html.ValidationMessageFor(m => m.commentModel.Message) 
     </p> 
     <p> 
      <input type="submit" value="Submit Comment" /> 
     </p> 
    } 

Sin embargo, cuando se envía el formulario, solo Name y Email devuelven un error de validación, cuando Message debe ser demasiado:

enter image description here

Si cambio MessageTextAreaFor-TextBoxFor, entonces la validación funciona correctamente.

¿Por qué es esto y cómo puedo obtener la validación para trabajar en mi cuadro de texto?


También vale la pena señalar que no he tenido que escribir ningún jQuery específico para este formulario. Seguí un tutorial que explica que esto no es necesario ya que todo es manejado por MVC3.

+0

¿Puede incluir el código de su controlador? Además, ¿incluyó ambos jquery.validate y jquery.validate.unobtrusive en su diseño o vista? –

+0

@ ron.defreitas ¿Qué método de controlador? Seguramente el método 'HttpPost' no sería relevante porque esto no se alcanza porque la validación del lado del cliente lo está impidiendo. Revisé mi archivo de diseño, he incluido: 'jquery-1.5.1.min.js',' jquery.validate.min.js' y 'jquery.validate.unobtrusive.js'. – Curt

+0

¿Puede ver el origen representado de su formulario y asegurarse de que el atributo de validación de datos se haya agregado al área de texto como el resto de los campos? ¿Has intentado recorrer el POST de tu formulario para ver si el backend piensa que hay entradas en la caja? –

Respuesta

10

Decore la propiedad del modelo correspondiente con la anotación de datos [DataType(DataType.MultilineText)] y utilice el método Html.EditorFor Helper.

[Required] 
[DataType(DataType.MultilineText)] 
public string Message { get; set; } 

Ahora usa @Html.EditorFor ayudante método

@Html.EditorFor(m => m.RoleDescription) 
1

Es un error con TextAreaFor cuando el modelo está anidado. Coloque el contenido de su CommentModel en el modelo "raíz", por así decirlo, y todo funciona muy bien. ¡O bien, cambie TextAreaFor a TextBoxFor y funciona de maravilla!

En un tema no relacionado, me siento validado de que no soy el único que intenta anidar mi modelo de comentarios como usted. ¡Esto realmente debería ser arreglado!

Editar: Aquí está el billete de errores para el tema:

http://aspnet.codeplex.com/workitem/8576

Edit2: solución de utilizar EditorFor de Shyju funciona! Curiosamente, también agrega algunos nombres de clase adicionales a la salida del, así que ten cuidado de que no entren en conflicto con tu CSS.

0

La respuesta de @Shyju parece funcionar perfectamente, pero tenía que añadir algo adicional para el archivo Site.css para hacer que funcione:

Aplicar solución @Shyju y añadir CSS de área de texto:

textarea.input-validation-error { 
    border: 1px solid #e80c4d; 
} 

Ahora funciona perfectamente.