为什么我不能在asp:CheckBox上设置值?

11

没有 Value 属性:

<asp:CheckBox ID="CheckBox1" runat="server" />

在标准HTML中,这是允许的:

<input type="checkbox" ID="CheckBox1" value="My Valyue" />

为什么?


1
@Mr Lister:http://www.w3schools.com/jsref/dom_obj_checkbox.asp - markzzz
糟糕,我的思维一定跑到了别的地方,抱歉。 - Mr Lister
2个回答

28

“Text”属性用于为复选框呈现标签。

该控件具有一个InputAttributes属性,您可以添加到其中:

myChk.InputAttributes.Add("value", "My Value");

我相信如果你只是在标记中添加value属性,它也会被填充。
你可以像这样访问该值:
myChk.InputAttributes["value"];

回答为什么Value不是CheckBox控件的内置属性的问题:

一个单独的CheckBox不需要值,根据定义,它是一个布尔值,并通过其ID标识。您只需要检查它是否被选中。

当您将多个复选框进行分组时,值就会发挥作用,此时有一个控件可用 - CheckBoxList,它使用ListItem - 每个ListItem都有一个Value属性。


这似乎很奇怪,我可以理解其他控件,但复选框?Value 似乎更有意义。我猜这都是关于从 GenericElement 继承以及类似的迭代常见接口的问题。 - j_mcnally
2
不!文本属性应该是复选框旁边的“标签”,而不是复选框本身的值。 - markzzz
@MrLister - 如果您有几个具有相同名称属性(使它们成为一组)的复选框,您将如何区分它们?该属性已经存在很长时间了。 - Oded
是的,但我应该知道那样的东西;熟悉HTML。当然,当表单被提交时,复选框的“值”会被发布,任何人都可以看到! - Mr Lister
@markzzz - 嗯...这是要问控件的创建者的。很有可能他们也有和MrLister一样的理由,即孤立的复选框不需要值。按定义来说,它是布尔类型的,并且通过其ID进行标识。当你_分组_ 复选框时,值才会发挥作用,你知道吗,有一个控件可以做到这一点 - CheckBoxList - Oded
显示剩余2条评论

3

不要使用asp:CheckBox控件,而是使用HTML输入复选框,并在服务器上运行它。

<input type="checkbox" id="ck" runat="server" value='<%# Eval("Value") %>' />
<asp:Label ID="lbl" runat="server" AssociatedControlID="ck" Text='<%# Eval("Name") %>'></asp:Label>

现在您可以从代码后台引用它作为一个HtmlInputCheckBox(我的最新示例位于一个重复项中,因此我可以使用其他元素来装饰这个替代复选框列表,例如工具提示图像)。
foreach (RepeaterItem repeaterItem in repCheckboxes.Items)
{
    HtmlInputCheckBox listItem = (HtmlInputCheckBox)repeaterItem.FindControl("ck");
    if (listItem.Checked)
    {
         string val = listItem.Value;
         ...

我知道这并没有回答问题OP的“为什么”,但这在搜索此确切问题时排名很高,并且这是一个好的解决方案。至于为什么,我认为微软出了问题,因为您无法控制CheckBoxList中的html。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接