在HtmlSelect和DropDownList之间,哪一个具有更好的性能(初始化和渲染速度更快)?有什么指导方针何时使用?
另一个问题是,如果我想从JScript访问select控件的值,我只能使用HtmlSelect(因为ID不会更改)或者是否有任何方法强制DropDownList使用我的ID而不是一个像“ctl00_MainContainerContentPlaceHolder_Day1DropDownList”?
答案 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访问每个控件。 您可以使用
在后面的代码中访问此IDDropDownList.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。