2011-01-11 7 views
0

Ich habe eine MVC 2-basierte Website mit einem Kontaktformular, das ein Anti-Spam-CAPTCHA-Bild enthält.MVC-Formular zum Aktualisieren eines Bildes

Nach dem Ausfüllen des Formulars entscheidet der Benutzer, dass er das Bild nicht lesen kann. Daher habe ich eine Schaltfläche, mit der der Benutzer die Seite mit einem anderen Bild aktualisieren kann. Dies führt zu einem vollständigen Neuladen der Seite (was mir gut geht).

Ich möchte die gesamte Seite laden mit den vorhandenen Daten zu bleiben und nur ein anderes Bild stattdessen anzeigen.

Wie also rufe ich eine Aktion auf, die die Werte behält und keine Validierung auslöst?

Jetzt ist das Problem, das ich habe, ... 1. Wie ich erlaube, die Post ohne auslösende Bestätigung durchzuführen? 2. Wie pflege ich die Formularwerte?

Ich bin nicht an AJAX-Lösungen interessiert und ich bin nicht an reCAPTCHA interessiert.

Danke. Dan.

UPDATE - denke ich habe eine Lösung - Feedback willkommen!

// 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

Offensichtlich würde ich in meiner endgültigen Version keine Validierungsprüfungen durchführen und sie dann löschen - die Validierungsprüfungen würden nur ausgeführt werden, wenn es die tatsächliche Schaltfläche zum endgültigen Senden wäre. Winziges bisschen hacky an dem Punkt, an dem ich alle Fehler beseitige - das ist der Punkt, an dem ich nervös bin - d. H. Im Falle von verschachtelten Formularen oder ausgefallenen mvc-Dingen, von denen ich nichts weiß. Außerdem habe ich MVC nur für eine Woche benutzt, also bin ich ein bekennendes n00b! –

Antwort

0

Wenn Sie wieder einzufangen, haben Sie für die

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

    return View("yourForm", m); 
} 

yourForm eine besondere Aktion erstellen - bilden ursprünglich Sie Benutzer anzuzeigen. Wenn m mit einigen Werten initialisiert wird, werden sie auf dem Formular angezeigt. Wenn Model.IsValid nicht aufgerufen wird, führt dies nicht zur Überprüfung.

+0

Nun, ich denke, das würde immer noch eine Validierung auslösen, da das Modell kommentiert wird. Aber ich mag, wie Sie die Daten zurückgeben! GENIUS. Ich werde gleich antworten - möchte Feedback darüber bekommen, wie hacky es ist. –

Verwandte Themen