ein LinkButton-, Calendar- oder WizardStep-Steuerelement vorhanden ist. Ich habe ein Problem mit __doPostBack festgestellt und eine Lösung gefunden. Ich suche eine Erklärung für die Ursache und/oder eine bessere Lösung als meine Arbeit.__doPostBack funktioniert nur, wenn auf der Seite
Szenario: Ich habe ein Dropdown mit den Werten gefüllt; "-Auswählen-", "Eins" & "Zwei". Wenn der Benutzer "Eins" auswählt, wird das clientseitige Skript ausgeführt. Wenn der Benutzer "Zwei" auswählt, wird das serverseitige Skript ausgeführt.
Problem: Das Client-Skript initiiert das Postback durch Aufruf von __doPostBack. Es tritt jedoch kein Post-Back auf, wenn auf der Seite auch kein LinkButton-, Calendar- oder WizardStep-Steuerelement vorhanden ist. Ich habe tatsächlich alle Standard-Tools in der Visual Studio Toolbox durchlaufen und alle getestet. Es muss einer von diesen drei sein.
Umgehen: Fügen Sie einen Link-Button hinzu, der von einem Bereich umgeben ist, dessen Anzeige auf "Keine" gesetzt ist.
<span style="display:none;">
<asp:LinkButton ID="LinkButton1" runat="server">LinkButton</asp:LinkButton>
</span>
Frage: Kann jemand eine Erklärung für dieses Verhalten liefern oder eine bessere fix als meine bieten „Work Around“?
Quelle - Javascript (ich es zwischen dem Kopf Tags platziert)
<script language="javascript" type="text/javascript">
function DropDownList1_change(elementRef) {
var selectedIndex = elementRef.selectedIndex;
if (selectedIndex > 0) {
var selectedValue = elementRef.options[selectedIndex].value;
if (selectedValue == "One") {
alert("Because you selected 'One', special javascript code will be executed");
// Special javascript code goes here
return;
}
else if (selectedValue == "Two") {
// Special server code gets executed on server DropDownList1_SelectedIndexChanged
__doPostBack('DropDownList1', '');
}
}
}
</script>
Quelle - ASPX Steuert
<asp:DropDownList ID="DropDownList1" runat="server" onchange="DropDownList1_change(this)" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
<asp:ListItem>-Select-</asp:ListItem>
<asp:ListItem>One</asp:ListItem>
<asp:ListItem>Two</asp:ListItem>
</asp:DropDownList>
<br />
<!-- For some unknown reason __doPostBack only works if there is a LinkButton, Calendar or WizardStep control on the page -->
<span style="display:none;">
<asp:LinkButton ID="LinkButton1" runat="server">LinkButton</asp:LinkButton>
</span>
Time of last Post Back: <asp:Label ID="Label1" runat="server"></asp:Label><br />
Time of OnSelectedIndexChanged: <asp:Label ID="Label2" runat="server"></asp:Label>
Quelle - Code hinter
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = DateTime.Now.ToLongTimeString();
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
Label2.Text = DateTime.Now.ToLongTimeString();
}
Zusätzliche Ressource - Ich fand den folgenden Artikel nach dem Posten dieser Frage. Es ist ein sehr alter Microsoft Artikel und der einzige Microsoft Artikel, den ich gefunden habe, der die spezifische Beschränkung von DropDowns erwähnt, gibt & Postbacks zurück. Ich habe nicht tief in ihre Lösung gegraben und bin mir nicht sicher, ob die Zeit es mir erlauben wird. Hauptsächlich posten Sie es für den Fall, dass meine Lösung fehlschlägt oder nicht für jemand anderen funktioniert.
Intuitiv können Sie ein Bestätigungsdialogfeld für eine Dropdown denken Zugabe ist identisch mit Zugabe eines solchen Dialogfeld für ein Button Web Kontrolle. Das heißt, setzen Sie einfach das clientseitige Attribut der DropDownList auf etwas wie: return confirm (...) ;. Verwenden: DropDownListID.Attributes ("onchange") = "return confirm (...);" Leider funktioniert dies nicht wie gewünscht, da ein AutoPostBack DropDownList Onchange-Attribut auf ein Bit JavaScript gesetzt wird, die ein Postback verursacht, nämlich einen Aufruf an die clientseitige __doPostBack Funktion.Wenn das onchange Attribut Einstellung sich programmatisch, ist das Endergebnis, dass die gerenderte clientseitige Onchange Ereignishandler sowohl Ihren Code und den Anruf zu __doPostBack hat:
Der Artikel ist für „Bestätigung lange so Suche mit Autopostback Dropdownlists“
https://msdn.microsoft.com/en-us/library/aa479302.aspx
Ehrlich gesagt, ist die beste Problemumgehung, die ich habe, WebForms nicht zu verwenden. Die Technologie ist absolut schrecklich, um im Browser irgendetwas Brauchbares zu tun, wie das, was Sie tun. Wenn Sie WebForms verwenden, dann sollten Sie meiner Meinung nach 100% tun, was bedeuten würde, anstatt "onchange" zu verwenden und herkömmliches Javascript auszuführen, Ihr 'One' -Szenario innerhalb des Postbacks selbst zu behandeln und möglicherweise angepasstes Javascript auf die Antwort davon zu registrieren Postback. –
Beobachten Sie dieses Verhalten in einem neuen Projekt? Ich habe versucht, das Problem (mit VS 2010 und .NET Framework 4.0) zu reproduzieren und das Postback wird jedes Mal durch Auswahl eines Elements in der DropDownList durchgeführt. – ConnorsFan
Ich bekomme das gleiche Verhalten in einem neuen Projekt; Ich habe sowohl eine leere neue Website als auch ein Webanwendungsprojekt zum Testen erstellt. Ich benutze VS 2010, .NET Framework 4, Windows 7 32 Bit & Cassini (werde es von IIS versuchen). – Dave