2009-10-18 28 views
9

Utilizando la plantilla de proyecto MVC en VS2008 (de la caja) que notaron los siguientes:Ajax.BeginForm - Viendo errores de validación

  1. Aquí es cómo se especifica la forma register.aspx.

    <% using (Html.BeginForm()) { %> 
    
  2. Al seleccionar el botón Registrar sin proporcionar ninguna información de cuenta se muestra esto. La creación de la cuenta no tuvo éxito. Por favor, corrija los errores e inténtelo de nuevo.

    • Debe especificar un nombre de usuario.
    • Debe especificar una dirección de correo electrónico.
    • Debe especificar una contraseña de 6 o más caracteres.

  3. Cambié el formulario Register.aspx a esto.

    <% using (Ajax.BeginForm("Register", new AjaxOptions { HttpMethod = "Post" })) { %> 
    
  4. Al seleccionar el botón Registro sin necesidad de suministrar una información de la cuenta no muestra ningún error.

Pregunta: ¿Cómo obtengo el texto de error para mostrar cuando uso Ajax.BeginForm?

Respuesta

14

Para aplicar correctamente el envío de formularios ajax, deberá modificar la acción Registrar y las vistas. De forma predeterminada, en caso de error, esta acción simplemente devuelve la vista register.aspx asociada. El primer paso sería poner el resumen de validación dentro de un control parcial del usuario:

ValidationSummary.ascx:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 
<%= Html.ValidationSummary("Account creation was unsuccessful. Please correct the errors and try again.") %> 

A continuación, se incluye este parcial dentro de la vista register.aspx:

<div id="validationSummary"> 
    <% Html.RenderPartial("ValidationSummary"); %> 
</div> 

<% using (Ajax.BeginForm(new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "validationSummary" })) { %> 
    FORM CODE HERE 
<% } %> 

Y finalmente modifica la acción Registrar:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Register(string userName, string email, string password, string confirmPassword) 
{ 
    // ... skipped content for clarity 

    // If we got this far, something failed, redisplay form 
    if (Request.IsAjaxRequest()) 
    { 
     // If an ajax request was made return only the validation errors 
     // instead of the whole page 
     return PartialView("ValidationSummary"); 
    } 
    else 
    { 
     return View(); 
    } 
} 

En caso de que el registro tiene éxito de forma predeterminada. La acción Registrar simplemente redirige a Inicio/Índice. También deberá modificar este bit porque, al realizar una solicitud ajax, la redirección no funcionará. De la misma manera que podría probar si está invocando la acción de forma asíncrona y devolver algún texto que indique que el registro fue exitoso. Este texto se mostrará dentro del mismo div como los errores de validación.


ACTUALIZACIÓN:

Una última pregunta - En lugar de la lista bala de mensajes de error, ¿cómo me sale cada mensaje de error controles para render junto al control mediante el HTML. Método ValidationMessage ("....") ?

Con el fin de lograr esto es necesario para poner el contenido de su forma dentro de una visión parcial:

<% using (Ajax.BeginForm(
    "register", 
    null, 
    new AjaxOptions { 
     HttpMethod = "POST", 
     UpdateTargetId = "myForm" 
    }, 
    new { 
     id = "myForm" 
    })) { %> 
    <% Html.RenderPartial("RegisterForm"); %> 
<% } %> 

Y en su acción de registro render la correcta parcial:

if (Request.IsAjaxRequest()) 
{ 
    return PartialView("RegisterForm"); 
} 
else 
{ 
    return View(); 
} 
Cuestiones relacionadas