HtmlSelect与DropDownList

时间:2009-05-25 01:57:02

标签: asp.net

在HtmlSelect和DropDownList之间,哪一个具有更好的性能(初始化和渲染速度更快)?有什么指导方针何时使用?

另一个问题是,如果我想从JScript访问select控件的值,我只能使用HtmlSelect(因为ID不会更改)或者是否有任何方法强制DropDownList使用我的ID而不是一个像“ctl00_MainContainerContentPlaceHolder_Day1DropDownList”?

3 个答案:

答案 0 :(得分:5)

由于没有人解决这个问题的表现方面,我想我会试一试。我最初的假设是,这两个选项中的任何一个都会使你获得相似的性能,因为它们会产生几乎相同的渲染HTML。但是,我把以下的.aspx页面放在一起来测试我的理论。

public enum ListType
{
    DropDownList,
    HtmlList
}

public partial class ListControlRenderTimeComparison : System.Web.UI.Page
{
    private Dictionary<ListType, Action<Int32>> _listMap = new Dictionary<ListType, Action<Int32>>();

    protected void Page_Load(object sender, EventArgs e)
    {
        InitializeListMap();

        for (int i = 0; i < ControlsToRender; i++)
        {
            _listMap[ListToRender](NumberOfItems);
        }
    }

    private void InitializeListMap()
    {
        _listMap.Add(ListType.DropDownList, AddDropDownList);
        _listMap.Add(ListType.HtmlList, AddHtmlList);
    }

    private void AddDropDownList(Int32 controlsToAdd)
    {
        var ddl = new DropDownList();

        for (int i = 0; i < controlsToAdd; i++)
            ddl.Items.Add((i + 1).ToString());

        form1.Controls.Add(ddl);
    }

    private void AddHtmlList(Int32 controlsToAdd)
    {
        var ddl = new HtmlSelect();

        for (int i = 0; i < controlsToAdd; i++)
            ddl.Items.Add((i + 1).ToString());

        form1.Controls.Add(ddl);
    }

    private Int32 NumberOfItems
    {
        get
        {
            Int32 timesToRender;

            return Int32.TryParse(Request.QueryString["numItems"], out timesToRender) ? timesToRender : 1;
        }
    }

    private Int32 ControlsToRender
    {
        get
        {
            Int32 timesToRender;

            return Int32.TryParse(Request.QueryString["numControls"], out timesToRender) ? timesToRender : 1;
        }
    }

    private ListType ListToRender
    {
        get
        {
            String listType = Request.QueryString["listType"];

            if (String.IsNullOrEmpty(listType)) return ListType.DropDownList;

            return (ListType)Enum.Parse(typeof (ListType), listType, true);
        }
    }
}

我用各种输入测试了这些控件中的每一个,并且发现每种情况下的迹线几乎相同。 HtmlOption控件在DropDownList上的性能优势很小,但即使每个控件渲染100个控件,每个控件只有几百分之一,但差别只有几百分之一秒。

所以最后......坚持使用DropDownList控件,因为它有更多可供选择的选项。 ASP.Net运行时装饰ID的问题可以轻松减轻,如其他答案所示。此外,您可以设计JavaScript函数,使其可以对作为参数传入的ID进行操作。

function doStuff(strId)
{
    document.getElementById(strId); //Straight up, no lime
    $get(strId); // Asp.Net Ajax Client Side Framework
    $(strId); // JQuery
}

如果你这样做,那么很容易绑定到客户端事件(onclick,onmouseover,onmouseout等等),以便在许多地方重用你的行为。

干杯, 约什

答案 1 :(得分:3)

我不认为你可以停止控件的名称生成。框架将基于内容占位符生成ID,以确保可通过唯一ID访问每个控件。 您可以使用

在后面的代码中访问此ID
DropDownList.ClientID

DropDownList.UniqueID

答案 2 :(得分:3)

<script type="text/javascript">
function Display()
{
 alert($('<%=this.FindControl("abc").ClientID%>').value);
}
</script>

<form id="form1" runat="server">
<div>
<asp:Panel runat="server" ID="container">
  <asp:TextBox ID="abc" runat="server" Text="Some text"></asp:TextBox>
  <br />
  <asp:Button ID="btn1" runat="server"  Text="Submit!!" OnClientClick="Display();"/>
</div>
</asp:Panel>

这可能很有用。即使重新安排容器,也不必担心框架生成的id。