Ich arbeite an einem alten Projekt, das im Laufe der Jahre von mehreren Leuten geschrieben und dann gepatcht wurde. An einigen Orten haben sie die SelectedValue-Eigenschaft und andere Orte, an denen sie SelectedItem.Value verwendet haben, verwendet.
Frage: Ist SelectedValue
nur ein syntaktischer Zucker für SelectedItem.Value
oder SelectedValue
, funktioniert das unter der Haube anders? Welches ist besser?
Bearbeiten: SelectedItem.Text wurde durch SelectedItem.Value ersetzt
SelectedValue
gibt denselben Wert wie SelectedItem.Value
zurück.
SelectedItem.Value
und SelectedItem.Text
können unterschiedliche Werte haben und die Leistung spielt hier keine Rolle, nur die Bedeutung dieser Eigenschaften ist wichtig.
<asp:DropDownList runat="server" ID="ddlUserTypes">
<asp:ListItem Text="Admins" Value="1" Selected="true" />
<asp:ListItem Text="Users" Value="2"/>
</asp:DropDownList>
Hier würden ddlUserTypes.SelectedItem.Value == ddlUserTypes.SelectedValue
und beide den Wert "1" zurückgeben.
ddlUserTypes.SelectedItem.Text
würde "Admins" zurückgeben, was sich von ddlUserTypes.SelectedValue
unterscheidet.
bearbeiten
selectedValue sieht unter der Haube so aus
public virtual string SelectedValue
{
get
{
int selectedIndex = this.SelectedIndex;
if (selectedIndex >= 0)
{
return this.Items[selectedIndex].Value;
}
return string.Empty;
}
}
und SelectedItem sieht folgendermaßen aus:
public virtual ListItem SelectedItem
{
get
{
int selectedIndex = this.SelectedIndex;
if (selectedIndex >= 0)
{
return this.Items[selectedIndex];
}
return null;
}
}
Ein Hauptunterschied zwischen diesen beiden Eigenschaften besteht darin, dass SelectedValue
auch einen setter hat, da SelectedItem
dies nicht tut. Der getter von SelectedValue
ist beim Schreiben von Code schneller, und das Problem der Ausführungsleistung hat keinen wirklichen Grund zur Diskussion. Ein großer Vorteil von SelectedValue ist auch die Verwendung von Bindungsausdrücken.
edit Datenbindungsszenario (Sie können SelectedItem.Value nicht verwenden)
<asp:Repeater runat="server">
<ItemTemplate>
<asp:DropDownList ID="ddlCategories" runat="server"
SelectedValue='<%# Eval("CategoryId")'>
</asp:DropDownList>
</ItemTemplate>
</asp:Repeater>
Ein wichtiger Unterschied zwischen den beiden (was im reflektierten Code sichtbar ist) ist, dass SelectedValue eine leere Zeichenfolge zurückgibt, wenn nichts ausgewählt ist, während SelectedItem.Value eine NullReference-Ausnahme auslöst.
Sie sind beide unterschiedlich. Die SelectedValue
-Eigenschaft gibt den tatsächlichen Wert des Elements in der Auswahl an, wohingegen SelectedItem.Text
den Anzeigetext anzeigt. Zum Beispiel: Sie haben ein ähnliches Bild
<asp:ListItem Text="German" Value="de"></asp:ListItem>
In diesem Fall wäre SelectedValue
de
und SelectedItem.Text
würde 'deutsch' geben.
BEARBEITEN:
In diesem Fall sind beide gleich ... Ursache SelectedValue
gibt den Wert des aktuell ausgewählten Elements in Ihrer Dropdown-Liste aus, und SelectedItem.Value
wird zum Wert des aktuell ausgewählten Elements.
Sie würden also beide dasselbe Ergebnis erzielen.
In der droupDown-Liste gibt es zwei Elementeigenschaften zum Hinzufügen.
1) Text 2) Wert
Wenn Sie eine Texteigenschaft abrufen möchten, verwenden Sie selecteditem.text
und Wenn Sie die value-Eigenschaft auswählen möchten, verwenden Sie die selectedvalue -Eigenschaft
In Ihrem Fall sind sowohl value als auch text property gleich, unabhängig davon, ob Sie selectedvalue oder selecteditem.text verwenden
Wenn beide unterschiedlich sind, ergeben sich unterschiedliche Ergebnisse
Seien Sie vorsichtig bei der Verwendung von SelectedItem.Text ... Wenn kein Element ausgewählt ist, ist SelectedItem null und SelectedItem.Text generiert eine Ausnahme mit dem Wert null.
.NET hätte eine SelectedText-Eigenschaft wie die SelectedValue-Eigenschaft bereitstellen müssen, die String.Empty zurückgibt, wenn kein ausgewähltes Element vorhanden ist.