Frage

Ich habe ein Element Swapper Kontrolle, die aus in zwei Listboxen und einige Tasten erstellt, die mir erlauben Elemente zwischen den beiden Listen zu tauschen. Der Austausch wird mit Hilfe von Javascript getan. Ich gehe auch Elemente nach oben und unten in der Liste. Grundsätzlich, wenn ich die Elemente in dem Listenfeld auf der rechten Seite bewegen speichere ich die Datakeys der Elemente (GUIDs) in einem Hidden. Auf Postbacks las ich einfach die GUIDs aus dem Feld. Alles funktioniert gut, aber auf Postbacks, erhalte ich die folgende Ausnahme:

  

Ungültige Postback oder Callback-Argument. Die Ereignisvalidierung wird in der Konfiguration oder <% @ Page EnableEventValidation = "true" %> in einer Seite aktiviert werden. Aus Sicherheitsgründen überprüft dieses Feature, dass Argumente oder Callback-Ereignisse Postback vom Server Kontrolle stammen, die ursprünglich sie gemacht. Wenn die Daten gültig und erwartet sind, verwenden, um die ClientScriptManager.RegisterForEventValidation Verfahren, um die Postback oder Callback-Daten für die Validierung zu registrieren.

Ich habe eine Testanwendung vorbereitet. Alles was Sie tun müssen, ist das Archiv herunterladen und das Projekt. Auf der Webseite wählen Sie die 3 Elemente hinzuzufügen, drücken Sie alle, dann das dritte Element eine Ebene nach oben bewegen und dann drücken Sie „Button“. Der Fehler wird angezeigt. Ereignisvalidierung Ausschalten ist keineswegs akzeptabel. Kann mir jemand helfen, ich habe schon zwei Tage lang ohne eine Lösung zu finden.

Testanwendung

War es hilfreich?

Lösung 3

Die erste Option wird erheblichen Aufwand bringen. Ich habe meine eigene benutzerdefinierte Steuerelement List-Box definiert aus der Listbox-Klasse abgeleitet und ausgeführt, um eine Überschreibung der loadpostback Daten:

public class CustomListBox : ListBox
{
    protected override bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
    {
        return true;
    }
}

Mit diesem anstelle des regulären Listbox in meiner Benutzersteuerung das Problem gelöst, jedoch gibt es keine Risiken im Zusammenhang mit meinem Ansatz?

Andere Tipps

Das Problem ist, dass die gespeicherten Ansichtszustand der Liste und die Daten auf Postbacks empfangen stimmen nicht überein. Die Ereignisvalidierung Problem ist höchstwahrscheinlich nur eine der möglichen Probleme, die aufgrund dieses Ansatzes erscheinen könnten. Die Architektur von Web-Formularen erlaubt es nicht, diese Art von Anwendungen und höchstwahrscheinlich wird es mit diesem Ansatz mehr Probleme, auch wenn Sie die Ereignisvalidierung Problem zu vermeiden erfolgreich zu sein. Sie haben mehrere Möglichkeiten:

1) Die einfachste ist die Auslagerungslogik auf dem Server zu tun, anstatt Javascript verwenden. Auf diese Weise der Ansichtszustand zwischen Postbacks und dem zusätzlichen Aufwand von mehreren Umläufen auf dem Server sein könnte kein Thema erhalten.

2) Wenn die mehrere Umläufe zum Server ist ein Problem, schreiben Sie ein Server-Steuerelement, das seine eigene Sicht Zustand behandelt. Das ist natürlich ein viel eingreifenden Ansatz.

3) Ein Mittelweg Ansatz zu verwenden, um zwei einfache HTML-Listen sein könnte (nur die HTML-Tags schreiben, ohne die asp.net Kontrollen zu verwenden) und hält auf der Client-Seite von JavaScript, um eine Liste von IDs in einem versteckten Bereich. Auf Post analysieren zurück, nur das versteckte Feld und extrahieren die IDs der HTML-Listen zu ignorieren.

I mit 1 gehen würde, wenn es keine ernsthaften Argumente dagegen sind.

Einige mögliche Optionen:

  • Wenn möglich, deaktivieren Sie Viewstate auf den beiden Listen. Ohne Viewstate wird nicht wissen, dass der Server, was die ursprünglichen Werte wurden und werden daher nicht fehler. Mit diesem Ansatz müssen Sie die Listen neu zu besiedeln (wegen des Mangels an Viewstate) und müssen möglicherweise die Auswahl manuell verfolgen -. Oder werden die Listen während OnInit Phase bevölkern müssen

  • Schalten Sie die Ereignisvalidierung (wenn Sie können)

  • Bestücken Sie beiden Listen vollständig auf der Server-Seite und Client-seitiges Script (JavaScript) verwenden, um Einträge aus den beiden Listen zu entfernen, je nach Bedarf.

Durch Zufall haben Sie versucht, diese schon? Tun Sie dies, wenn Sie mit der Liste in irgendeiner Weise Dreck.

document.getElementById("listbox").selectedIndex = -1;

Es beschwert sich, weil das ausgewählte Element in einer Liste in der Liste nicht vorhanden war, als es gemacht wurde. Betrachten Sie Pagemethods über AJAX Ihre Daten zurück zum Formular zu erhalten, anstatt Postback. Oder verwenden Sie einen nicht-Eingang steuert die Daten zu halten - wie ungeordnete Listen, die Sie Listenelemente hin und her zwischen bewegen. Sie können die GUIDs in versteckten Spannweiten in der Liste Element gebracht, wo man sie bekommen kann, wenn es sein muss.

Alternativ können Sie eine serverseitige Htmlselect anstelle einer List-Box verwenden, um die Ereignisvalidierung Problem zu umgehen. Best of all, können Sie in der Lage sein, viel von Ihrem Code-hinter sich lassen intakt (dh. Liste Bevölkerung Logik ist die gleiche wie List-Box).

<select runat="server" id="myList" multiple="true" />

Sie können das Ereignis Render außer Kraft setzen alle möglichen Listbox Elemente mit beiden Listboxen zu registrieren. Auf diese Weise, egal, welche Gegenstände bewegt werden, wo die Validierung erwartet sie.

protected override void Render(HtmlTextWriter writer)
{
  foreach (DictionaryEntry entry in ColumnConfig) {          
    Page.ClientScript.RegisterForEventValidation(lstbxColumnsToExport.UniqueID,(string)entry.Key);
    Page.ClientScript.RegisterForEventValidation(lstbxNonExportColumns.UniqueID,(string)entry.Key);
  }
  base.Render(writer);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top