2011-03-11 15 views
13

Estoy tratando de hacer una validación manual para poder publicar mi formulario a través de AJAX.Validación del lado del cliente ASP.Net MVC 3 con un formulario dinámico

También estoy cargando mi forma dinámica utilizando $("#formHolder").load(url);

Cuando me carga la página en el DIV siempre valida como verdad, a pesar de que mi caja de entrada está vacía.

llamada es decir if($("#MyForm").valid()) //is always true

Sin embargo Si voy a la URL de la página directamente funciona bien.

Entonces, ¿cómo puedo inicializar el formulario correctamente después de cargarlo a través de .load(url); ya que no existe en la página cuando abrió por primera vez

Mi JavaScript es

$('.myLink').click(function() { 
    var url = '/newsletter/info/'; // this loads my HTML form from another page/view at runtime 
    $("#formHolder").load(url, function() { 
      $("#MyForm").validate(); // I thought this line would initialise it once it loads 
      }).dialog({ 
     modal: true, 
     width:800, 
     height: 600 
    }); 
    return false; 
}); 

Respuesta

15

Calling $.validator.unobtrusive.parse() trabajos manualmente después de que el formulario se ha cargado

he encontrado la solución aquí http://btburnett.com/2011/01/mvc-3-unobtrusive-ajax-improvements.html

+0

cambio de bit: $ .validator – Morteza

+1

sugerencia: debe especificar un selector: p. parse ('body') – ulrichb

+0

De acuerdo con @ulrichb. Sin un selector (o un objeto jQuery) no funcionó para mí. Por cierto: un alcance mayor significará un peor rendimiento, por lo que en lugar de '' cuerpo '' deberías enviar '$ (" # MyForm ")' o cualquier elemento que cargues dinámicamente – Diego

8

Su pregunta no especifica si es necesario hacer nada personalizada para validar la forma, así que sin duda ir con construido en la validación de jQuery discreta de MVC3:

Si este es su modelo:

public class Person 
{ 
    [Required(ErrorMessage = "Email address required")] 
    [DataType(DataType.EmailAddress, ErrorMessage = "Please enter valid email address")] 
    public string Email { get; set; } 
} 

este Formulario de código en su opinión permitirá la validación al instante con una cantidad mínima de configuración:

@model MvcApplication12.Models.Person 

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using (Ajax.BeginForm(new AjaxOptions())) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>Person</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Email) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Email) 
      @Html.ValidationMessageFor(model => model.Email) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

Si desea más funcionalidad cuando el formulario se registró puede utilizar AjaxOptions:

new AjaxOptions() { UpdateTargetId = "formupdate", 
        OnSuccess = "javascript:alert('success');", 
        OnFailure = "javascript:alert('failure');", 
        OnComplete = "javascript:alert('complete');", 
        OnBegin = "javascript:alert('begin');" }) 

Esto le da control total sobre las acciones personalizadas a medida que se envía, completa, falla o comienza el formulario.

Espero que esto ayude!

+0

gracias esa es una respuesta excelente y aprendí mucho de ella. Sin embargo, después de investigar un poco, me di cuenta de que mi problema solo ocurre cuando el formulario se carga sobre la marcha y he actualizado/cambiado mi pregunta significativamente al mismo tiempo que respondía. lo siento. Pero creo que su correo electrónico ayudará a muchas personas de la misma manera – Daveo

+0

aha :) Estoy bastante seguro de que esto tiene que ver con la forma en que el validator-javascript conecta los eventos. Dado que los elementos no están allí en la carga de la página, pero se agregan al DOM más tarde, es posible que no registre los eventos correctamente (sin usar .live() por ejemplo). Debo decir que nunca he usado el método .validate(), así que no estoy muy seguro de lo que hace. –

9

La mejor solución es llamar $.validator.unobtrusive.parse('#frmToBeValidated'), justo después de su carga ajax de forma dinámica.

Cuestiones relacionadas