2016-05-13 13 views
1

Ich habe ein Formular mit zwei Textfeldern. Ich erhalte Daten aus der Datenbank , um die Felder zu füllen. Wenn mein Benutzer auf Senden Schaltfläche klickt und der Inhalt der 2 Textfelder sich nicht ändert, möchte ich den Code nicht durchlaufen.Bestimmen Sie, ob es Änderungen in einem Formular gibt, wenn Sie auf eine Senden-Schaltfläche klicken

Wie kann ich feststellen, wann sich der Inhalt der Boxen ändert und wann sich nichts ändert? Muss ich irgendeine Art von Vergleich zu dem machen, was ich im Gedächtnis habe?

 public ActionResult Edit(profile objprofiler) 
     { 
      if (ModelState.IsValid) 
      { 
       //Go fetch the existing profile from the database 
       var currentProfile = db.Profiles.FirstOrDefault(p => p.ProfileId == objprofiler.ProfileId); 
       //Update the database record with the values from your model 
       currentProfile.City = objprofiler.City; 
       currentProfile.State = objprofiler.State; 
       //Commit to the database! 
       db.SaveChanges(); 
       ViewBag.success = "Your changes have been saved"; 
       return View(profiler); 
      } 
     } 

Antwort

1

Sie können die Werte mit einer einfachen if Bedingung vergleichen. So etwas wie das:

if ((currentProfile.City != objprofiler.City) || (currentProfile.State != objprofiler.State)) 
{ 
    currentProfile.City = objprofiler.City; 
    currentProfile.State = objprofiler.State; 

    db.SaveChanges(); 
} 

Oder verwenden Sie die Logik, die Sie versuchen zu erreichen, wirklich. Ob Sie für jedes Feld einzeln vergleichen möchten, verwenden Sie && anstelle von || usw. Die Logik, die Sie implementieren möchten, liegt bei Ihnen. Aber Sie würden den Vergleich in einer if Aussage durchführen.

Beachten Sie auch, dass Sie string.Equals() statt nur == Operator verwenden können, um Zeichenfolgen mit einigen weiteren Optionen zu vergleichen, z. B. Groß- und Kleinschreibung und andere nützliche Dinge.


Wenn der Vergleich komplexer wird, können Sie auch in der profile selbst Objekt einzukapseln. Vielleicht durch Überschreiben .Equals(), obwohl das andere Auswirkungen beim Testen auf Gleichheit hat. Vielleicht nur eine einfache Hilfsfunktion:

public bool IsEqualTo(profile obj) 
{ 
    return this.City == obj.City 
     && this.State == obj.State; 
} 

Dann in der Steuerung Sie nur diese Methode verwenden kann:

if (!currentProfile.IsEqualTo(objprofiler)) 
    db.SaveChanges(); 
+0

so was passiert, wenn ich ein Formular mit 40 Feldern habe. Werde ich 40 Felder vergleichen? Dafür muss es eine bessere Lösung geben. Denkst du nicht auch? – user2320476

+0

@ user2320476: Was genau möchten Sie hier erreichen? Wenn Sie 40 Vergleiche machen wollen, müssen Sie 40 Vergleiche anstellen. Sie können den Vergleich im Objekt selbst kapseln, so dass es im Controller nur eine einzige Codezeile gibt, um diese Funktionalität aufzurufen. (Überschreibe '.Equals()', vielleicht?) Ich schätze, die Frage wird wirklich ... Ist dieser zusätzliche Code es wert, eine Reise in die Datenbank zu speichern? Was wird wirklich erreicht, indem diese Reise in die Datenbank gespeichert wird? Wenn die Leistung * schlecht * ist, kann das Problem woanders liegen. – David

+0

Was ich sage ist, dass es eine Möglichkeit geben muss, Änderungen in einem Formular mit begrenztem Code zu bestimmen und 40 Felder nicht mit einer if-Anweisung zu vergleichen. Vielen Dank. – user2320476

0

Die Art, wie ich dies in der Regel handhaben ist durch eine ‚schmutzige‘ Flagge jederzeit eine Dateneinstellung Änderungsereignis tritt bei allen Steuerelementen des Formulars auf.

Wenn der Benutzer kommt, um das Formular zu senden, überprüfe ich einfach den Status des Flags, um zu sehen, ob Änderungen gespeichert werden müssen. Dadurch wird vermieden, dass alle Daten mit ihren vorherigen Zuständen verglichen werden müssen, was lästig sein kann, wenn das Formular viele Eingabesteuerelemente enthält.

Zum Beispiel:

bool isDirty; 

    private void textBox_TextChanged(object sender, EventArgs e) 
    { 
     // Possible validation here 
     SetDirty(true); 
    } 

    private void SetDirty(bool dirty) 
    { 
     // Possible global validation here 
     isDirty = dirty; 
    } 

    private void Submit() 
    { 
     if(isDirty) 
     { 
      // Save logic 
     } 
    } 

Dieser Ansatz ermöglicht es Ihnen, all globale Validierungslogik ausgeführt, wenn alle Daten geändert werden.

Vorbehalt: Wenn ein Benutzer eine Änderung vornimmt, dann kehrt er zurück, das Formular übermittelt die Daten trotzdem.

+0

'textBox_TextChanged'? Dies sieht für mich nicht wie MVC aus. Obwohl es sicherlich die Möglichkeit bietet, diese Logik * clientseitige * durchzuführen, was eine weitere Option für das OP ist. Wenn es ihm egal ist, ob Benutzer die Logik umgehen oder nicht, heißt das. – David

+0

Yeah textBox_TextChanged ist Windows-Entwicklung richtig? Das ist nicht mvc oder? – user2320476

+0

Entschuldigung, ich habe die Frage missverstanden. Ich denke, Sie können das ziemlich ignorieren. – Jack

0

Auf der Client-Seite können Sie überprüfen, ob sich der Wert geändert hat, indem Sie einige js ausführen, um den Wert des Elements mit seinem Anfangswert zu vergleichen. Etwas wie das.

function hasFormChanged() { 
    //textboxes, textareas 
    var els = document.querySelectorAll('input[type="text"], textarea, input[type="number"]'); 
    for (i = 0; i < els.length; i++) { 
     var el = els[i]; 
     if (el.value !== el.defaultValue) { 
      return true; 
     } 
    } 

    //checkboxes and radios 
    els = document.querySelectorAll('input[type="radio"], input[type="checkbox"]'); 
    for (i = 0; i < els.length; i++) { 
     var el = els[i]; 
     if (el.checked !== el.defaultChecked) { 
      return true; 
     } 
    } 

    //select 
    els = document.querySelectorAll('select'); 
    for (i = 0; i < els.length; i++) { 
     var el = els[i]; 
     if (el.options[el.selectedIndex].value != '') { 
      if (!el.options[el.selectedIndex].defaultSelected) { 
       return true; 
      } 
     } 
    } 

//if we get here then nothing must have changed 
return false; 
} 

und die Funktion return true darauf hinweist, dass sich etwas geändert hat Sie eine versteckte Form Wert wie diese

<input type="hidden" value="false" id="AnyUpdates" name="AnyUpdates"/> 

auf true gesetzt werden.

Dann in Ihrem Controller-Update lesen Sie dieses Feld, um festzustellen, ob Sie Ihre db Zeug tun müssen.

Verwandte Themen