设为首页收藏本站

就爱编程论坛

 找回密码
 注册

人人连接登陆

无需注册,直接登录

用新浪微博连接

一步搞定

QQ登录

只需一步,快速开始

查看: 1865|回复: 5
打印 上一主题 下一主题

input中disabled提交后得不到值的解决办法及区别 [复制链接]

Rank: 9Rank: 9Rank: 9

  • TA的每日心情
    无聊
    2025-5-27 03:37:20
  • 签到天数: 366 天

    [LV.9]以坛为家II

    论坛先锋 学习至圣 荣誉成员 论坛元老 活跃之星 终极领袖

    我玩的应用:

    跳转到指定楼层
    楼主
    发表于 2011-7-5 12:39:16 |只看该作者 |倒序浏览
    input的字段当为diabled时时无法获取数值得,所以最近不要用这个,我们可以用readonly带替代,即可解决这类问题。
      

    <input name="country"  id="country"  size=12 value="disabled"  disabled="disabled" >


        放在form表单中提交后得不到该值。
    将disabled="disabled" 改为 readonly = "readonly" 即可 ,按照W3C的规范:http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.12

        设置为disabled的input将会有下面的限制:
        1.不能接收焦点
        2.使用tab键时将被跳过
        3.可能不是successful的

        设置为readonly的input将会有下面的限制:
        1.可以接收焦点但不能被修改
        2.可以使用tab键进行导航
        3.可能是successful的
        只有successful的表单元素才是有效数据,也即是可以进行提交。disabled和readonly的文本输入框只能通过脚本进行修改value属性。

        一、来看看这两个属性在效果和使用上的区别
       
        1 readonly是要锁定这个控件,通过在界面上无法修改他(但是通过javascript可以修改他)。

        2 disabled 和readonly有相同的地方也是可以锁定这个控件用户不能改变他的值,但是disabled的更彻底一些,他是要使你完全不能使用他,包括改变他的背景颜色(不信,你去修改一个被disabled掉的input文本框,你发现你是徒劳),如果是checkbox则不能选中他。

        3 所有控件都有disabled 属性,但是不一定有readonly属性,如select 下拉框。
        (1)text
       

        (2) checkBox
       

        (3)select下拉选择框(这里只能显示disabled和非disabled的区别,因为select 没有readonly属性
       

        (4)button按钮
       

        说明:点击被readonly掉的按钮照样可以触发事件,但是被disabled掉的按钮就无法使用了不管上面有没有事件。

        (5)div
       

        说明:将div设置disabled属性之后,整个div都灰掉了,但是文本框里面还是可以输入内容的。
        注意:select下拉选择框是没有readonly属性的

        二、来看看这两个属性在数据提交方面的区别

        先来写一个测试代码:
       

    <form id="form1" runat="server">
    <div>
    <asp:TextBox ID="txt_Disabled" runat="server" Text="disabled"   disabled="disabled" ></asp:TextBox><br />
    <asp:TextBox ID="txt_ReadOnly" runat="server" Text="ReadOnly"   readonly="readonly"></asp:TextBox><br />
    <asp:TextBox ID="txt_Normal" runat="server" Text="normal" ></asp:TextBox><br />
    <asp:Button ID="btn_Test" runat="server"   Text="提交数据" />
    <input type="button" name="btn_ChangeValue" value="改变readonly的值" />
    </div>
    </form>



    在这里,写了一个asp表单页面,使用了get 方式提交


    从提交的url可以看出被disabled的控件的值没有提交到服务器,这个时候在服务器端是获取不到这个控件的值的,

    相反,被设置成readonly的文本框的值是提交到服务器的。

    这里出现了一个奇怪的情况,readonly的文本框是被设置成readonly的了,但是我通过下面的按钮 "改变readonly值"

    document.all('txt_ReadOnly').value = 'myzzb' 这个时候 被readonly的值显示的是myzzb了,现在我点提交数据,在服务器端获取到了值是myzzb了,但是奇怪的是,回传到页面之后,页面的readonly控件里面还是显示的是改变myzzb之前的 Readonly的值了,这究竟是什么原因呢?

    这是微软在.net2.0里面做的小改动。如果Textbox的ReadOnly属性设置成"True",ViewState将不会被回发到服务器,虽然客户端已经更改了。但是我们依然还是可以用TextBox.Attributes.Add("readonly","readonly") 来实现。

    在服务器端去设置一个控件的readonly 和在客户端设置一个文本框的readonly属性是有区别的。在服务器端我们用TextBox.Attributes.Add("readonly","readonly") 页面在回传的时候,即使文本框是readonly 的,也是会改变他的值的,在客户端在2.0里面就会不会显示客户端的修改。

    ps:在.net 1.1 里面 不会出现上面值还保存之前的值的情况。


    大家仔细想一下会有一个问题出现,就是有时候我们写程序的时候,比如一个购买商品的页面,我们可以在上面输入商品的数量,但是价格我们设置成只读的,最后下面有一个总价格就是 数量 * 只读的价格,那么我们很可能就是这样做的,在后台的时候读取 商品数量的 textbox值,然后读取 价格的textbox的值,然后两者的积 作为总金额 uodate到数据库中去了,如果客户端的用户和我们一样是一个会点程序的小程序员,那么麻烦就有可能来拉,他可以查看源文件,查看到被readonly的价格的文本框的id或者是name什么的,然后在浏览器中输入脚本去改变价格的值,然后点提交,那么这个小程序员就可以随便怎么给自己打折都不过份啊。

    就想下面的列子显示的,在浏览器中输入脚本改变单价,然后在点返回就可以看到单价已经被改拉。


    那么,服务器端设置设置readonly ,disabled和在客户端设置readonly,disabled的有什么不同吗?

    我们现在通过在服务器端去设置这两个控件,代码如下:


    我们将表单的提交方法设置成get提交,我们就可以在url里面看到提交的内容,发现被设置成disabled的控件没有提交到服务器,readonly的提交数据到服务器了,如下图所示:

    这说明和客户端的效果是一样的。


    通过以上的测试说明以下几点:

    1,客户端设置readonly,disabled和服务器端设置readonly效果一样。

    2,readonly的数据是可以提交到服务器的,disabled的数据是不可以提交到服务器的。

    3,在.net1.1里面设置成readonly的textbox 在客户端改变之后。服务器是会回传用js改变的值,在.net 2.0里面是不可以回传到客户端,除非你在服务器端设置他的readonly属性(这个时候就和1.1效果一样)。

    4,设置成readonly的TextBox在客户端修改数据会提交到服务器,那么作为程序员的你,千万不要update的时候也把这个值修改,如果你是购物网站这么做的话,那么你完蛋了。

    5,在服务器端用txtBox.enabled = false;在客户端解析的时候会给TextBox加上diabaled也就是说,数据不能提交到服务器的。


    从提交的url可以看出被disabled的控件的值没有提交到服务器,这个时候在服务器端是获取不到这个控件的值的,

    相反,被设置成readonly的文本框的值是提交到服务器的。
    分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    分享分享0 收藏收藏0 支持支持0 反对反对0 分享到人人 转发到微博
    [img=http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=fRUcHhYWGAQ9GxIFEBwUEVMeEhA]http://rescdn.qqmail.com/zh_CN/htmledition/images/function/qm_open/ico_mailme_02.png[/img]

    使用道具 举报

    Rank: 2

    升级 
     
    38.67%

    该用户从未签到

    沙发
    发表于 2011-8-27 19:13:12 |只看该作者
    支持~~支持~~













    使用道具 举报

    Rank: 9Rank: 9Rank: 9

  • TA的每日心情
    无聊
    2025-5-27 03:37:20
  • 签到天数: 366 天

    [LV.9]以坛为家II

    论坛先锋 学习至圣 荣誉成员 论坛元老 活跃之星 终极领袖

    板凳
    发表于 2011-8-28 14:41:56 |只看该作者
    回复 多晴酷夏 的帖子

    是不是web同行?
    [img=http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=fRUcHhYWGAQ9GxIFEBwUEVMeEhA]http://rescdn.qqmail.com/zh_CN/htmledition/images/function/qm_open/ico_mailme_02.png[/img]

    使用道具 举报

    Rank: 2

    升级 
     
    0%

    该用户从未签到

    地板
    发表于 2011-9-8 13:27:45 |只看该作者

    使用道具 举报

    Rank: 3Rank: 3

    升级 
     
    46.33%

    该用户从未签到

    5#
    发表于 2011-10-12 21:05:50 |只看该作者

    使用道具 举报

    Rank: 3Rank: 3

    升级 
     
    52.33%

    该用户从未签到

    6#
    发表于 2011-10-16 10:41:24 |只看该作者

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册 人人连接登陆

    晴云孤魂's Blog|就爱编程搜帖|手机版|Archiver|就爱编程论坛     

    GMT+8, 2025-7-2 03:22 , Processed in 0.125101 second(s), 36 queries .

    Powered by Discuz! X2

    © 2001-2011 Comsenz Inc.

    回顶部