.net一bug,来看看

yzncong 2013-09-30 01:14:59

<select id="test" runat="server">
<option value="1">测试</option>
<option value="1">测试</option>
<option value="1">测试</option>
<option value="1">测试</option>
</select>


当K,V值相同时,
SelectedIndex
获取到的值永远等于0,换用DropDownList,同样。不晓得为什么会这样?
...全文
750 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
王者天杰 2013-10-10
  • 打赏
  • 举报
回复
key 必须唯一 这不算bug。
yzncong 2013-10-10
  • 打赏
  • 举报
回复
引用 9 楼 c02645 的回复:
LZ为什么想着会有value和text值都相同的选项出来呢? 就像数据库的没有设置主键一样,id值都是1有很多条。 如果你想取id=1的一条数据,你会知道你取到的是数据库的第几条吗?
确实有这种需求,不然,也不会发现这个bug。
jiaoshiyao 2013-09-30
  • 打赏
  • 举报
回复
楼主设计的Html就有bug
  • 打赏
  • 举报
回复
引用 4 楼 caozhy 的回复:
[quote=引用 楼主 yzncong 的回复:]

<select id="test" runat="server">
<option value="1">测试</option>
<option value="1">测试</option>
<option value="1">测试</option>
<option value="1">测试</option>
</select>
当K,V值相同时,
SelectedIndex
获取到的值永远等于0,换用DropDownList,同样。不晓得为什么会这样?
因为它post上去的是value=1,服务器据此推断selectindex[/quote]+1
gengchenhui 2013-09-30
  • 打赏
  • 举报
回复
这是不懂基础的缘故吧? 嗯,我说微软他们那帮人,根本不懂最基础的html,还开发个P的ASP.NET啊,楼主你说是么???
threenewbee 2013-09-30
  • 打赏
  • 举报
回复
所以论坛中有很多脚本小子在搞所谓的“模拟浏览器提交”,你不要觉得奇怪——他们连浏览器都不用,哪里来的selectindex,人家照样提交数据。
threenewbee 2013-09-30
  • 打赏
  • 举报
回复
引用 楼主 yzncong 的回复:

<select id="test" runat="server">
<option value="1">测试</option>
<option value="1">测试</option>
<option value="1">测试</option>
<option value="1">测试</option>
</select>
当K,V值相同时,
SelectedIndex
获取到的值永远等于0,换用DropDownList,同样。不晓得为什么会这样?
因为它post上去的是value=1,服务器据此推断selectindex
  • 打赏
  • 举报
回复
对于asp.net这么低门槛的东西,学习它要会读取源代码。 来看看 HtmlSelect 控件的源代码
bool IPostBackDataHandler.LoadPostData(string postDataKey, NameValueCollection postCollection)
{
	return this.LoadPostData(postDataKey, postCollection);
}

protected virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection)
{
	string[] values = postCollection.GetValues(postDataKey);
	bool flag = false;
	if (values != null)
	{
		if (!this.Multiple)
		{
			int num = this.Items.FindByValueInternal(values[0], false);
			if (this.SelectedIndex != num)
			{
				this.SelectedIndex = num;
				flag = true;
			}
		}
		else
		{
			int num2 = values.Length;
			int[] selectedIndices = this.SelectedIndices;
			int[] array = new int[num2];
			for (int i = 0; i < num2; i++)
			{
				array[i] = this.Items.FindByValueInternal(values[i], false);
			}
			if (selectedIndices.Length == num2)
			{
				for (int j = 0; j < num2; j++)
				{
					if (array[j] != selectedIndices[j])
					{
						flag = true;
						break;
					}
				}
			}
			else
			{
				flag = true;
			}
			if (flag)
			{
				this.Select(array);
			}
		}
	}
	else
	{
		if (this.SelectedIndex != -1)
		{
			this.SelectedIndex = -1;
			flag = true;
		}
	}
	if (flag)
	{
		base.ValidateEvent(postDataKey);
	}
	return flag;
}

public virtual int SelectedIndex
{
	get
	{
		for (int i = 0; i < this.Items.Count; i++)
		{
			if (this.Items[i].Selected)
			{
				return i;
			}
		}
		if (this.Size <= 1 && !this.Multiple)
		{
			if (this.Items.Count > 0)
			{
				this.Items[0].Selected = true;
			}
			return 0;
		}
		return -1;
	}
	set
	{
		if (this.Items.Count == 0)
		{
			this.cachedSelectedIndex = value;
			return;
		}
		if (value < -1 || value >= this.Items.Count)
		{
			throw new ArgumentOutOfRangeException("value");
		}
		this.ClearSelection();
		if (value >= 0)
		{
			this.Items[value].Selected = true;
		}
	}
}

internal int FindByValueInternal(string value, bool includeDisabled)
{
	int num = 0;
	foreach (ListItem listItem in this.listItems)
	{
		if (listItem.Value.Equals(value) && (includeDisabled || listItem.Enabled))
		{
			return num;
		}
		num++;
	}
	return -1;
}
  • 打赏
  • 举报
回复
出现你这个疑问,主要原因使你没有去理解html从浏览器端给服务器提交的是什么值(字符串“1”,而不是位置编号)。如果你稍微深入一点,不要浅尝辄止,就会更容易搞懂技术了。
  • 打赏
  • 举报
回复
假如客户端post一个字符串“1”这个值,你的控件要找到对应的index,自然是第一个(下标0)就匹配。 本来就是如此,没有什么可奇怪的。
洪爷爷 2013-09-30
  • 打赏
  • 举报
回复
index不是从0开始算的吗?
c02645 2013-09-30
  • 打赏
  • 举报
回复
LZ为什么想着会有value和text值都相同的选项出来呢? 就像数据库的没有设置主键一样,id值都是1有很多条。 如果你想取id=1的一条数据,你会知道你取到的是数据库的第几条吗?

62,252

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧