2011-01-11 2 views
0

J'ai un site Web basé sur MVC 2 avec un formulaire de contact qui contient une image CAPTCHA anti-spam.Message de formulaire MVC pour actualiser une image

Après avoir terminé la plupart du formulaire, l'utilisateur décide qu'il ne peut pas lire l'image, donc j'ai un bouton qui permet à l'utilisateur de rafraîchir la page avec une image différente. Cela provoque un rechargement complet de la page (ce que je vais bien).

Je veux que la page entière se charge avec les données existantes pour rester et affiche simplement une image différente à la place.

Alors comment appeler une action qui conserve les valeurs et ne déclenche pas de validation?

Maintenant, le problème que j'ai est ... 1. Comment autoriser l'exécution de la publication sans validation de déclenchement? 2. Comment gérer les valeurs de formulaire?

Je ne suis pas intéressé par les solutions AJAX et je ne suis pas intéressé par reCAPTCHA.

Merci. Dan.

MISE À JOUR - je pense avoir une solution - commentaires bienvenus!

// All buttons on a form are post to the same action method so read in the value of the submit buttons to take appropriate action. 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult sendlink(BusinessLinkModel linkToCreate, string button) 
{ 
    // Validation logic 
    if (string.IsNullOrWhiteSpace(linkToCreate.BusinessTitle)) ModelState.AddModelError("BusinessTitle", "Business title is required."); 

    string submitButtonName = button; 

    // If we want to "reload" the captcha image, then we'll clear all the errors, do nothing with the data but update the session so the image 
    // is re-generated appropriately. 
    if (submitButtonName == "reload") 
    { 
     // Clear the errors - hacktastic! 
     foreach (ModelState item in this.ModelState.Values.ToList()) 
     { 
      item.Errors.Clear(); 
     } 

     ResetSecurityCode(); 
    } 

    return View(); 
} 

// This is the image url i.e. /home/GenerateSecurityImage 
[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult GenerateSecurityImage() 
{ 
    string code = Session["CAPTCHA_Contact"] == null ? ResetSecurityCode() : Session["CAPTCHA_Contact"].ToString(); 

    Response.ContentType = "image/jpeg"; 
    GenerateImage(code, 180, 70).Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); 
    Response.End(); 

    return View(); 
} 
+0

Évidemment, dans ma version finale, je n'effectuerais pas de contrôles de validation, puis je les effacerais - les contrôles de validation ne seraient effectués que s'il s'agissait du bouton d'envoi final réel. Je suis un peu hacky au point où je contourne toutes les erreurs - c'est le peu que je suis nerveux - c'est-à-dire dans le cas de formulaires imbriqués ou de choses mvc fantaisistes que je ne connais pas. En outre, j'ai seulement utilisé MVC pendant une semaine, donc je suis un n00b confessé! –

Répondre

0

Si vous ne Reconquista, vous devez créer une action spéciale pour que

public ActionResult Recapture(Model m) 
{ 
    // reinit capture 

    return View("yourForm", m); 
} 

yourForm - forme que vous affichez à l'origine à l'utilisateur. Si m est initialisé avec certaines valeurs, elles seront affichées sur le formulaire. Si Model.IsValid n'est pas appelé, cela ne provoquerait pas de validation.

+0

Eh bien, je pense que cela déclencherait encore la validation car le modèle sera annoté. Mais j'aime bien comment vous transmettez les données! GÉNIE. Je vais vous répondre dans un instant - j'aimerais avoir votre avis sur la façon dont il est hacky. –

Questions connexes