Frage

Ich habe die folgende Situation vor:

Ein Benutzer wird eine bestimmte Filter auf einer Seite definieren, und auf Postbacks werde ich die Datenbank mit diesen Filter abfragen und eine Reihe von passenden Datensätzen an den Benutzer zurückgegeben, die jeweils mit einem Kontrollkästchen daneben, so kann er sich entscheiden, ob wirken auf jeder dieser Datensätze.

Im klassischen ASP / PHP kann ich viele Kontrollen namens „chk __ *“ erzeugen und dann auf Postbacks gehen durch alle $ POST-Einträge für die, die suchen Präfix „chk “.

Was ist der beste Weg, dies in ASP.Net tun 2.0?

Ich kann es einfach tun, indem Sie einen Repeater mit einer Vorlage der Umsetzung der Checkbox enthält, binden den Repeater an einen Datensatz, und dann auf dem zweiten Postback, das tue ich nur:

For Each it As RepeaterItem In repContacts.Items
    Dim chkTemp As CheckBox = DirectCast(it.FindControl("cbSelect"), CheckBox)
    If chkTemp.Checked Then

    End If
Next

Allerdings hat dies die leichten Nachteil mir eine riesige Viewstate zu geben, was wirklich schlecht ist, weil der Kunde den gesamten Ansichtszustand an den Server neu laden muß, und diese Leute wahrscheinlich verwenden werden meine Seite über eine beschissene Verbindung.

Jede andere Ideen? (Ich kann auch die Steuerelemente dynamisch erstellen und wie in den alten Tagen durch Request.Form laufen, aber ich war auf der Suche für eine sauberere

War es hilfreich?

Lösung

Machen Sie es genauso, wie Sie es im klassischen ASP tat. Mit statt . Sie können die rohe Post mit Paramater Request.Form zugreifen

Andere Tipps

Haben Sie sich die CheckBoxList Kontrolle? Sie können es auf Ihre Daten-Set binden, Textelement und Wert Mitglied Elemente bieten, und es wird Ihnen auch erlauben, leicht zu sehen, welche Elemente geprüft werden. Es besteht auch die Möglichkeit, dynamisch mehr Kontrollkästchen Elemente hinzufügen, wenn nötig.

Ich empfehle die klassische ASP-Lösung, wenn sie mit absurden Bedingungen konfrontiert Viewstate. Es ist traurig, die netten Features, die es bietet, zu verlieren, aber die Kombination von einige Viewstate aktiviert Kontrollen (asp: *) mit einigen klassischen Techniken (input type = „...“) hat mich gerettet ein Los von Kopfschmerzen in der Vergangenheit.

Manchmal möchte man einfach nur etwas einfach zu tun, und die einfache Lösung schlägt „WYSIWYG“ Form bearbeiten.

Eines der Dinge, die ich getan habe, um den Zustand eines Schecks über AJAX in der Sitzung aufnehmen, dann auf Postback (vollständige oder teilweise über AJAX), schauen Sie in der Sitzung für die Elemente auf die gewählte Aktion auszuführen.

Die Grundidee ist es, einen Onclick-Handler auf das Kontrollkästchen, um hinzuzufügen, die die ID des zugehörigen Artikels kennt. Im Handler auf Klick diese ID kommunizieren über AJAX an den Server zurück, und es in der Sitzung aufzeichnen - Sie werden Kontrollkästchen Status und kommunizieren müssen, damit Sie Elemente deaktivieren können. Hat die Prozedur für die Steuerung übertragen, die Daten verwenden, um die Elemente aus der Sitzung ausgewählt wurden.

Auf diese Weise können Sie ausgelagerten Daten als auch zu handhaben, da Sie den Anfangswert der Checkbox aus der Sitzung festlegen können beim Rendern (entweder vollständig oder teilweise) eine Seite mit markierten Produkte auf es.

Es könnte wie folgt aussehen. Unter der Annahme, ASP.NET AJAX mit Pagemethods (und Script, natürlich).

<script type='text/javascript'>
   function record(checkbox,item)
   {
       var context = { ctl : checkbox };
       PageMethods.Record(item,checkbox.checked,onSuccess,onFailure,context);
   }

   function onSuccess(result,context)
   {
      // do something, maybe highlight the row, maybe nothing
   }

   function onFailure(error,context)
   {
       context.ctl.checked = false;
       alert(error.get_Message());
   }
</script>


...
<tr><td><input type='checkbox' onclick='record(this,"item_1");'></td><td>Item 1</td></tr>
...

Codebehind

[WebMethod(EnableSessionState=true)]
public static void Record( string itemName, bool value )
{
     List<string> itemList = (List<string>)Session["Items"];
     if (itemList == null)
     {
        itemList = new List<string>();
        Session["Items"] = itemList;
     }
     if (itemList.Contains(itemName) && !value)
     {
         itemList.Remove(itemName);
     }
     else if (!itemList.Contains(itemName) && value)
     {
         itemList.Add(itemName);
     }       
}

protected void button_OnClick( object sender, EventArgs e )
{
     List<string> itemList = (List<string>)Session["Items"];
     if (itemList != null)
     {
         foreach (string item in itemList)
         {
             // do something with the selected item
         }
     }
}

Deaktivieren Sie die Viewstate. Für den Fall, kann es nicht Session mit getan werden versuchen, das speichern, Ansichtszustand

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top