2012-03-27 16 views
6

Estoy usando MVC y Razor por primera vez y tengo lo que es, afortunadamente, una pregunta fácil. Tengo dos páginas en el sitio. La primera página (Página A) tiene una forma muy pequeña que tiene una entrada para una dirección de correo electrónico. cuando el usuario introduce su dirección de correo electrónico y hace clic en Enviar que se envían a la página B usando HttpPost, así:MVC Razor - Cómo enviar un formulario a sí mismo

@using (Html.BeginForm("NewsletterSignup","Common", FormMethod.Post)) 
{ 
    <p> 
     <input type="text" class="text" value="Enter your email address" id="email" name="email" /> 
     <input type="submit" class="submit" value="Sign Up" /> 
    </p> 
} 

en la página B no es la forma principal que permite al usuario introducir también su nombre y número de teléfono móvil. El controlador para el formulario principal se ve así:

//newsletter signup page 
public ActionResult NewsletterSignup() 
{ 
    var model = new NewsletterSignupModel(); 

    return View(model); 
} 

[HttpPost, ActionName("NewsletterSignup")] 
public ActionResult NewsletterSignupSend(NewsletterSignupModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     //register the user here 
    } 

    return View(model); 
} 

En el formulario principal que tengo un ValidationSummary y validación para cada uno de los campos. El problema es que mi controlador afirma que la acción NewsletterSignupSend solo se puede ejecutar usando HttpPost. Debido a que el formulario de la página A usa HttpPost cuando el usuario llega a la página B, la validación ya se ha ejecutado, es decir, antes de que el usuario haya enviado el formulario en la página b.

Sé que me estoy perdiendo un básico aquí - ¿alguien puede dirigirme en la dirección correcta?

Gracias de antemano Al

ACTUALIZACIÓN: Para resolver esta cuestión que he hecho lo siguiente.

Forma A se representa utilizando:

@Html.Action("MiniNewsletterSignup") 

forma A tiene un método controlador:

//mini newsletter view 
     public ActionResult MiniNewsletterSignup() 
     { 
      var model = new MiniNewsletterSignupModel(); 

      return View(model); 
     } 

Y el contenido de la vista es:

@model Nop.Web.Models.Common.MiniNewsletterSignupModel 
@using (Html.BeginForm("NewsletterSignup", "Common")) 
{ 
    <p> 
     <input type="text" class="text" value="Enter your email address" id="email" name="email" /> 
     <input type="submit" class="submit" value="Sign Up" /> 
    </p> 
} 

Este envía el formulario utilizando HttpPost en la página B.

Página B tiene 2 métodos de controlador:

//newsletter signup page 
public ActionResult NewsletterSignup() 
{ 
    var model = new NewsletterSignupModel(); 

    if (Request["email"] != null) 
     model.Email = Request["email"]; 

    return View(model); 
} 

Y:

[HttpPost, **WhenRequestContainsKey("FullName")**] 
public ActionResult NewsletterSignup(NewsletterSignupModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     //process here 
    } 

    return View(model); 
} 

Usted notará que he añadido el Selector de WhenRequestContainsKey que he encontrado en http://softwaredevelopmentsolutions.blogspot.co.uk/2011/06/aspnet-mvc-3-partial-form-validation-on.html. Esto significa que este código solo se llama cuando hay un campo en la Solicitud llamado FullName, que en nuestro sitio solo existe en la página B.

Esto parece funcionar como yo lo quería, pero no estoy seguro de por qué: por qué, por ejemplo ¿Esto detiene la validación hasta que el formulario se publique nuevamente en la página B? ¿No hay nada en el método que llame a un método de validación?

¿Hay algún problema con la forma en que lo he implementado?

Gracias Al

Respuesta

2

Ponga un [HttpGet] en la primera de ellas:

[HttpGet] 
public ActionResult NewsletterSignup() 
{ 
    var model = new NewsletterSignupModel(); 
    return View(model); 
} 
8

Creo que se echa en falta una acción post - si intenta seguir el modelo GET-POST-redirigida se debe evitar estos problemas (es decir,todos los envíos que se debe redirigir a una acción GET):

FirstAction() 
{ 
    return View(); 
} 

[HttpPost] 
FirstAction() 
{ 
    //Save email address 
    return Redirect("NewsletterSignup","Common"); 
} 

Y su primera forma se convierte en:

@using (Html.BeginForm()) 
{ 
    <p> 
     <input type="text" class="text" value="Enter your email address" id="email" name="email" /> 
     <input type="submit" class="submit" value="Sign Up" /> 
    </p> 
} 
+0

Hola arroz - gracias por la respuesta. El problema con su sugerencia es que el primer formulario pasa a través de la dirección de correo electrónico ingresada en el campo de texto; esto se perderá si usa un redireccionamiento. – higgsy

+0

Puede abrir la dirección de correo electrónico en TempData y acceder a ella en el siguiente GET: http://msdn.microsoft.com/en-us/library/dd394711.aspx (busque TempData). – Paddy

+0

Hola Paddy - Intenté con lo que sugeriste. Sin embargo, FirstAction ahora produce el mensaje de error "Las acciones secundarias no pueden realizar acciones de redireccionamiento". Invoco el primer formulario con @ Html.Action ("MiniNewsletterSignup") – higgsy

Cuestiones relacionadas