我最近在ASP.NET DropDownList中发现了一个奇怪的行为,希望有人能解释一下。
基本上我遇到的问题是在回发之前进行数据绑定,然后将SelectedValue
设置为数据项列表中不存在的值时,调用根本没有效果。但是,在回发时,同一个呼叫将失败并显示ArgumentOutOfRangeException()
'cmbCountry'有一个SelectedValue无效,因为它在项目列表中不存在。 参数名称:值
我正在使用以下代码。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
cmbCountry.DataSource = GetCountries();
cmbCountry.DataBind();
cmbCountry.SelectedValue = ""; //No effect
}
else
{
cmbCountry.SelectedValue = ""; //ArgumentOutOfRangeException is thrown
}
}
protected List<Country> GetCountries()
{
List<Country> result = new List<Country>();
result.Add(new Country() { ID = Guid.NewGuid(), Description = "Test" });
result.Add(new Country() { ID = Guid.NewGuid(), Description = "Test1" });
result.Add(new Country() { ID = Guid.NewGuid(), Description = "Test2" });
result.Add(new Country() { ID = Guid.NewGuid(), Description = "Test3" });
return result;
}
public class Country
{
public Country() { }
public Guid ID { get; set; }
public string Description { get; set; }
}
有人可以请我澄清这种行为的原因,并建议是否有任何解决方法?
答案 0 :(得分:2)
DropDownList&gt; SelectedValue Property&gt;的 ArgumentOutOfRangeException 强>
所选值不在可用值和视图列表中 已加载状态或其他状态(已执行回发)。 有关详细信息,请参阅“备注”部分。
来源:MSDN
DropDownList&gt; SelectedValue属性&gt;的备注强>
(...)当所选值不在可用值列表中时 并执行回发,ArgumentOutOfRangeException异常 被扔了。 (...)
来源:MSDN
另外,我做了以下测试:
!IsPostBack
上,添加了一个包含4项作为数据源的列表,ID为1~4 SelectedValue = 5
combo.Items.Add(new ListItem()...)
添加了新项目
醇>
我希望将ID 5视为组合中当前所选的项目,但它没有发生。
毕竟,看起来这种行为是设计。我还没有找到更多的信息,所以以下只是我的想法:感觉就像,在任意设置控件的数据源之后,开发人员可以自由选择一个不存在的项目,这根本没有效果。但是,在回传处理中绑定视图状态后,控件的列表是验证的(或类似的东西),因此必须相应地对其进行操作。
答案 1 :(得分:2)
我不确定为什么它是这样设计的,但DropDownList只会在PostBack上抛出此异常...这里是来自ILSpy的setter代码:
public virtual string SelectedValue
{
get { ... }
set
{
if (this.Items.Count != 0)
{
if (value == null || (base.DesignMode && value.Length == 0))
{
this.ClearSelection();
return;
}
ListItem listItem = this.Items.FindByValue(value);
/********** Checks IsPostBack here **********/
bool flag = this.Page != null &&
this.Page.IsPostBack &&
this._stateLoaded;
if (flag && listItem == null)
{
throw new ArgumentOutOfRangeException("value",
SR.GetString("ListControl_SelectionOutOfRange", new object[]
{
this.ID,
"SelectedValue"
}));
}
if (listItem != null)
{
this.ClearSelection();
listItem.Selected = true;
}
}
this.cachedSelectedValue = value;
}
}
您可以通过将SelectedValue设置为null而不是空字符串来解决此问题。