SelectedValue与DropDownList的SelectedItem.Value

vul*_*ven 40 .net asp.net drop-down-menu

我正在编写一个旧项目,然后多年来由几个人修补.在某些地方,他们使用了SelectedValue属性,而其他地方则使用了SelectedItem.Value.

问:是否SelectedValue只是一个语法糖用于SelectedItem.ValueSelectedValue引擎盖下的工作方式不同?哪一个表现更好?

编辑: SelectedItem.Text替换为SelectedItem.Value

Adr*_*ode 58

SelectedValue返回相同的值SelectedItem.Value.

SelectedItem.Value并且SelectedItem.Text可能具有不同的值,并且性能不是这里的因素,只有这些属性的含义很重要.

<asp:DropDownList runat="server" ID="ddlUserTypes">
    <asp:ListItem Text="Admins" Value="1" Selected="true" />
    <asp:ListItem Text="Users" Value="2"/>
</asp:DropDownList>
Run Code Online (Sandbox Code Playgroud)

在这里,ddlUserTypes.SelectedItem.Value == ddlUserTypes.SelectedValue两者都将返回值"1".

ddlUserTypes.SelectedItem.Text 将返回"管理员",这是不同的 ddlUserTypes.SelectedValue

编辑

引擎盖下,SelectedValue看起来像这样

public virtual string SelectedValue
{
    get
    {
        int selectedIndex = this.SelectedIndex;
        if (selectedIndex >= 0)
        {
            return this.Items[selectedIndex].Value;
        }
        return string.Empty;
    }
}
Run Code Online (Sandbox Code Playgroud)

和SelectedItem看起来像这样:

public virtual ListItem SelectedItem
{
    get
    {
        int selectedIndex = this.SelectedIndex;
        if (selectedIndex >= 0)
        {
            return this.Items[selectedIndex];
        }
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

这两个属性之间的一个主要区别在于它SelectedValue也有一个setter,因为SelectedItem它没有.在吸气SelectedValue编写代码时,和执行性能的问题必须要讨论没有真正的理由是更快.SelectedValue的一大优点是使用Binding表达式时.

编辑数据绑定方案(不能使用SelectedItem.Value)

<asp:Repeater runat="server">
 <ItemTemplate>
     <asp:DropDownList ID="ddlCategories" runat="server" 
                       SelectedValue='<%# Eval("CategoryId")%>'>
     </asp:DropDownList>
 </ItemTemplate>
</asp:Repeater>
Run Code Online (Sandbox Code Playgroud)


Jos*_*ker 9

两者之间的一个重要区别(在Reflected代码中可见)是如果未选择任何内容,SelectedValue将返回空字符串,而SelectedItem.Value将抛出NullReference异常.