我是在属性列表里选的multiple属性,实际效果如下
<select …… runat="server" multiple="multiple">
</select>但运行时报错Parser Error
Description: An error occurred during the parsing of a resource required to service this request. Please review the following specific parse error details and modify your source file appropriately. Parser Error Message: Cannot create an object of type 'System.Boolean' from its string representation 'multiple' for the 'Multiple' property.PS : 是ASP.NET 2.0
<select …… runat="server" multiple="multiple">
</select>但运行时报错Parser Error
Description: An error occurred during the parsing of a resource required to service this request. Please review the following specific parse error details and modify your source file appropriately. Parser Error Message: Cannot create an object of type 'System.Boolean' from its string representation 'multiple' for the 'Multiple' property.PS : 是ASP.NET 2.0
<asp:ListBox ID="ListBox1" runat="server" SelectionMode="Multiple">
<asp:ListItem>item1</asp:ListItem>
<asp:ListItem>item2</asp:ListItem>
<asp:ListItem>item3</asp:ListItem>
</asp:ListBox>
[code=HTML]
<select size="4" name="ListBox1" multiple="multiple" id="ListBox1">
<option value="item1">item1</option>
<option value="item2">item2</option>
<option value="item3">item3</option>[/code]
<option></option>
</select>是服务器控件中的dropdownlist<select id="Select1" runat="server" multiple="multiple">
<option></option>
</select>是服务器控件中的ListBox,应该不会有问题的
但是我要的是服务器端select,
标题里写得很清楚了1楼的可以,这我也知道但是我想知道为啥我在属性列表里选的属性却会运行时出错
在属性列表里选的属性,其实是HTML控件本身的属性,
但是它却把之当作一个服务器端属性来直接解析了,
难道是个bug?
估计写控件的人,弄混了.就像textbox在web form下和winform下的控件的设置一样. 只不过那个没有bug
{
if (value)
{
base.Attributes["multiple"] = "multiple";
}
else
{
base.Attributes["multiple"] = null;
}
}所以只有使用multiple= "true"是正确的;我觉得此处的multiple属性应该
像htmlbutton的disabled一样在RenderAttributes里解析生成就好了
</select>
Ivony... 13:31:51
然后,我给SELECT加上disabled属性,这也是一个空值属性。Ivony... 13:32:18
结果disabled属性不被智能提示所识别。无论是设置disabled还是设置disabled="disabled",结果都是正确的。Ivony... 13:33:33
然后我又在input上测试,确定disable="disabled"这样的表达式能够被Parser分析。Ivony... 13:33:55
再查Input类型,确定Disabled是bool型。Ivony... 13:34:29
至此,可以确定是微软没有在Select元素上采取特殊处理所造成的。
Ivony... 13:40:53
Disabled属性的定义在HtmlControl类。Ivony... 13:41:18
[DefaultValue(false), WebCategory("Behavior"), TypeConverter(typeof(MinimizableAttributeTypeConverter)), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool Disabled
{
get
{
string str = this.Attributes["disabled"];
if (str == null)
{
return false;
}
return str.Equals("disabled");
}
set
{
if (value)
{
this.Attributes["disabled"] = "disabled";
}
else
{
this.Attributes["disabled"] = null;
}
}
}Ivony... 13:41:47
看得出来Disabled属性值的获取和设置都是直接操作AttributesIvony... 13:44:09
而事实上几乎所有的Html控件的属性都是直接操作Attributes,如Ivony... 13:44:16
[WebCategory("Appearance"), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), DefaultValue(-1)]
public int Size
{
get
{
string s = base.Attributes["size"];
if (s == null)
{
return -1;
}
return int.Parse(s, CultureInfo.InvariantCulture);
}
set
{
base.Attributes["size"] = HtmlControl.MapIntegerAttributeToString(value);
}
}
Ivony... 13:44:32
这是HtmlInputText的Size属性。Ivony... 13:44:58
言归正传,HtmlSelect的Multiple属性是这么写的:
[WebCategory("Behavior"), DefaultValue(""), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool Multiple
{
get
{
string str = base.Attributes["multiple"];
if (str == null)
{
return false;
}
return str.Equals("multiple");
}
set
{
if (value)
{
base.Attributes["multiple"] = "multiple";
}
else
{
base.Attributes["multiple"] = null;
}
}
}
Ivony... 13:45:10
可以看得出来,与Disabled属性完全没有任何区别。Ivony... 13:45:20
那么区别在哪里呢?Ivony... 13:45:47
就是特性,这是HtmlControl.Disabled的特性:
[DefaultValue(false), WebCategory("Behavior"), TypeConverter(typeof(MinimizableAttributeTypeConverter)), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]Ivony... 13:46:12
这个是HtmlSelect.Multiple的:
[WebCategory("Behavior"), DefaultValue(""), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]Ivony... 13:46:47
TypeConverter(typeof(MinimizableAttributeTypeConverter))
这个TypeConverter,便是问题的关键。Ivony... 13:47:27
这个TypeConverter的代码如下:
internal class MinimizableAttributeTypeConverter : BooleanConverter
{
// Methods
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return ((sourceType == typeof(string)) || base.CanConvertFrom(context, sourceType));
} public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
string a = value as string;
if (a == null)
{
return base.ConvertFrom(context, culture, value);
}
return ((a.Length > 0) && !string.Equals(a, "false", StringComparison.OrdinalIgnoreCase));
}
}Ivony... 13:49:14
结论,微软忘了给Multiple属性做TypeConverter从而导致了问题。
/**
*Ivony... 13:53:25
*将Multiple的特性加一个 TypeConverter(typeof(MinimizableAttributeTypeConverter)),应该就可以了
*Ivony... 13:53:50
*我莫名其妙的得一大堆分,岂不是有倒分的嫌疑? *维也纳(wien..) 13:54:28
*我把QQ的记录复制过去
*/
因为Ivony的比较辛苦,没有功劳,也有苦劳,呵呵~
Ivony是神啊,
在神面前,
我们不得不承认自己是小白了~
无耻的VMM……