带Value属性的扩展CheckBox控件
来源:互联网 发布:数据库删除外键约束 编辑:程序博客网 时间:2024/04/29 12:40
ASP.NET 的CheckBox 提供了对 <input type="checkbox" /> 标记 的封装,但是CheckBox没有提供与客户端相对应的 value 属性,而很多时候(不管是server side 或者client side )我们在确定某个CheckBox 被 checked,也需要获取一个对应的 value。
如何解决?其实方法很多。
下面是改控件呈现的HTML:
需要注意的是:
如果在 Value 属性的 set 访问器中这样设置:
但是如果设置其他属性却是可以的:
FeedBack:
如何解决?其实方法很多。
- 为每个CheckBox 提供 HiddenField,将 CheckBox对应的Value存储在HiddenField中
缺点:麻烦,繁琐。 - 为每个CheckBox 提供 ViewState,将 CheckBox对应的Value存储在ViewState中
缺点:无法在client side 读取。 - 换用CheckBoxList,因为 CheckBoxList 实现了 ListControl,同时具有Text和Value属性
缺点:单个CheckBox不合适。适合于多个CheckBox的组合。
knonwn bug: CheckBoxlist 内部使用的 ListITem.Attributes 为实现视图(ViewState) updated: @07-05-13 - 换用Html服务器控件:<input runat="server" type="checkbox" />
缺点:没有了Text属性,如果需要需要自行添加。 - 开发自己的扩展CheckBox,使之具有Value属性,并对<input type="checkbox" valu="somevlaue" />对应。
- more unknown solutions。^_^
下面就是一个扩展的CheckBox:
[DefaultProperty("Text")]
[ToolboxData("<{0}:XCheckBox runat=/"server/" />")]
public class XCheckBox : CheckBox
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public string Value
{
get
{
String s = (String)ViewState["Value"];
// updated @07-05-13
return String.IsNullOrEmpty(s) ? "on" : s;
//return ((s == null) ? String.Empty : s);
}
set
{
// 将值存储在 ViewState 中
ViewState["Value"] = value;
}
}
protected override void RenderContents(HtmlTextWriter output)
{
base.RenderContents(output);
}
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
// 添加 value 属性标记(在客户端呈现),并设置对应 Value属性值(服务器端)
writer.AddAttribute(HtmlTextWriterAttribute.Value, Value);
base.AddAttributesToRender(writer);
}
}
[ToolboxData("<{0}:XCheckBox runat=/"server/" />")]
public class XCheckBox : CheckBox
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public string Value
{
get
{
String s = (String)ViewState["Value"];
// updated @07-05-13
return String.IsNullOrEmpty(s) ? "on" : s;
//return ((s == null) ? String.Empty : s);
}
set
{
// 将值存储在 ViewState 中
ViewState["Value"] = value;
}
}
protected override void RenderContents(HtmlTextWriter output)
{
base.RenderContents(output);
}
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
// 添加 value 属性标记(在客户端呈现),并设置对应 Value属性值(服务器端)
writer.AddAttribute(HtmlTextWriterAttribute.Value, Value);
base.AddAttributesToRender(writer);
}
}
下面是改控件呈现的HTML:
<input value="valueOfXCheckBox1" id="XCheckBox1" type="checkbox" name="XCheckBox1" /><label for="XCheckBox1">textOfXCheckBox1</label>
需要注意的是:
如果在 Value 属性的 set 访问器中这样设置:
this.Attributes["value"] = value;
asp。net引擎不会在客户端呈现 value属性标记,因此不会得到预期的效果但是如果设置其他属性却是可以的:
this.Attributes["onclick"] = "alert(this.id)";
anybody knows why?
updated:2007年5月13日
发现了一个bug,当你将checkbox的value设置成空字符串的时候,如,
checkbox1.Attributes["value"] = "";
那么当页面回发(PostBock)的时候服务端无法真正获取此checkbox.checked 属性,此时永远返回页面初次请求的checkbox1.checked值,
后来才明白,原来html form中对于 <input type=checkbox>的value属性 具有默认值:on,如果这样设置<input type="checkbox" value="" />,那么表单回发是不会包含此 checkbox的,服务器自然也得不到这个值(asp.net 中通过 Request.Form 集合获取)
因此,应该如此修改 XCheckBox.Value 实现:
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public string Value
{
get
{
String s = (String)ViewState["Value"];
return String.IsNullOrEmpty(s) ? "on" : s;
}
set
{
ViewState["Value"] = value;
}
}
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public string Value
{
get
{
String s = (String)ViewState["Value"];
return String.IsNullOrEmpty(s) ? "on" : s;
}
set
{
ViewState["Value"] = value;
}
}
posted on 2006-08-31 12:27 晓风残月 阅读(609) 评论(4) 编辑 收藏 所属分类: asp.net 、asp.net 2.0
FeedBack:
#1楼 [楼主]
2006-09-01 22:15 | 晓风残月
今天发现了一个bug,
如果对xcheckbox应用theme,将不会得到预期的呈现,变成了:
<span value="1" title="选择"><input id="chkItem" type="checkbox" name="chkItem" /></span>
不知道为什么?等待研究...
不过,client side还是可以使用 chkItem.parentNode.value 方便的获取。
回复 引用 查看
如果对xcheckbox应用theme,将不会得到预期的呈现,变成了:
<span value="1" title="选择"><input id="chkItem" type="checkbox" name="chkItem" /></span>
不知道为什么?等待研究...
不过,client side还是可以使用 chkItem.parentNode.value 方便的获取。
回复 引用 查看
#2楼 [楼主]
2006-09-01 22:22 | 晓风残月
终于发现并不是theme的问题,
而是asp.net再呈现checkbox本身的问题:
如果对checkbox应用tooltip属性,就会对该checkbox附加span标记,将title应用到span里面。
<asp:checkbox id="CheckBox1" runat="server" tooltip="check me" />
呈现成:
<span title="check me"><input id="CheckBox1" type="checkbox" name="CheckBox1" /></span>
而不是预期的
<input id="CheckBox1" type="checkbox" name="CheckBox1" title="check me" />
回复 引用 查看
而是asp.net再呈现checkbox本身的问题:
如果对checkbox应用tooltip属性,就会对该checkbox附加span标记,将title应用到span里面。
<asp:checkbox id="CheckBox1" runat="server" tooltip="check me" />
呈现成:
<span title="check me"><input id="CheckBox1" type="checkbox" name="CheckBox1" /></span>
而不是预期的
<input id="CheckBox1" type="checkbox" name="CheckBox1" title="check me" />
回复 引用 查看
#3楼 [楼主]
2007-05-13 13:19 | 晓风残月
发现了一个bug,当你将checkbox的value设置成空字符串的时候,如,
checkbox1.Attributes["value"] = "";
那么当页面回发(PostBock)的时候服务端无法真正获取此checkbox.checked 属性,此时永远返回页面初次请求的checkbox1.checked值,
后来才明白,原来html form中对于 <input type=checkbox>的value属性 具有默认值:on,如果这样设置<input type="checkbox" value="" />,那么表单回发是不会包含此 checkbox的,服务器自然也得不到这个值(asp.net 中通过 Request.Form 集合获取)
回复 引用 查看
checkbox1.Attributes["value"] = "";
那么当页面回发(PostBock)的时候服务端无法真正获取此checkbox.checked 属性,此时永远返回页面初次请求的checkbox1.checked值,
后来才明白,原来html form中对于 <input type=checkbox>的value属性 具有默认值:on,如果这样设置<input type="checkbox" value="" />,那么表单回发是不会包含此 checkbox的,服务器自然也得不到这个值(asp.net 中通过 Request.Form 集合获取)
回复 引用 查看
#4楼
2007-07-16 10:09 | zxz524 [未注册用户]
还是有问题,如果设置CssClass value 就会被重写到span标签上去
回复 引用 查看
回复 引用 查看
- 带Value属性的扩展CheckBox控件
- html checkbox的checked属性问题和value属性问题
- jquery扩展的easyui-checkbox控件
- 带 checkBox 多选框的 Treeview 控件
- 带checkbox的网页树形控件
- 带checkbox的网页树形控件
- 带CheckBox,RadioButton的网页树控件
- 自定义控件--带动画的CheckBox
- 自定义控件--带动画的CheckBox
- CheckedListBox 中添加带 Text 和 Value 的 CheckBox
- asp.net的checkbox没有value属性的解决办法
- 支持三态CheckBox的 MFC TreeCtrl 控件扩展
- 美化浏览器自带的 radio ,checkbox 属性
- 带CheckBox,RadioButton的网页树控件—EXTree
- 扩展 Visual Editor 的控件和属性
- 给界面上的控件扩展属性
- 带自定义属性的view控件
- 带Checkbox的TreeView
- 我就想传个图片2
- how to detect VMM using (almost) one CPU instruction
- 美次贷危机对中国经济影响到底多大
- 实现薪水翻番的七大秘诀
- 忘记了root密码,如何进入系统?
- 带Value属性的扩展CheckBox控件
- Teechart序列号
- 一道著名外企面试题的抽丝剥茧
- 范伟导老师Sniffer课程资料
- ASP.NET状态管理 APPlication,Session,Cookie和ViewState等对象用法和区别
- V1 Module
- 对付kernel / fsd inline hook/ssdt hook
- V2 Module
- 传说瑞星主动的一段代码