asp。net的
asp页有:
文本框testquestion
文本框testanswer
按钮enter
代码页:
pageloud
{
a=生成随机数;
testquestion.Text=a;
}
enter_click
{
if(testquestion==testanswer)
代码1
else
代码2
}
为什么根本就不能执行代码1呢?该如何做?请指教?!急!
asp页有:
文本框testquestion
文本框testanswer
按钮enter
代码页:
pageloud
{
a=生成随机数;
testquestion.Text=a;
}
enter_click
{
if(testquestion==testanswer)
代码1
else
代码2
}
为什么根本就不能执行代码1呢?该如何做?请指教?!急!
调试。。看testquestion和testanswer的值分别得到的是多少。
这个不需要调试了吧?原因见下:楼主你不要直接用文本框对象比较,两个实例化的TextBox对象肯定不一样呀。应该是:
if(testquestion.Text ==testanswer.Text)
代码1
else
代码2
}
应该比较文本框对象的Text属性的值,而非比较文本框对象本身。
比较文本框对象本身的话,两个实例化后的对象铁定不一样,lz的逻辑是对的,只是比较对象错了而已,已经在三楼说明了,呵呵。
{
if (!IsPostBack)
{
... 原来的代码
}
}
随机数肯定是要变的呀,如果你不让它变,那也就失去验证码的意义了,对不?你自己产生的随机数,即使是随时变化,但是你的代码里面肯定知道的,对不?
这时你会要求用户在一个TextBox中输入,你把用户输入的文本和你自己产生的随机数对比,没有任何问题,再怎么变化也逃不过你的控制呀,对吧。我上面说的意思是,你代码里面写的是“if(testquestion==testanswer)”,testquestion和testanswer是TextBox,而不是TextBox.Text,你需要比较的是Text呀,应该是“if(testquestion.Text == testanswer.Text)”才对呀,难道我上面没说明白么,郁闷。
只是在还没比较的时候,随机数的值也就是testquestion.Text就已经变化了,导致比较错误。这就是原因,但是我想不出解决方案呀
那就应该控制testquestion.Text值的生成,你代码中每次新生成随机数的条件是什么呢,只要控制好这个条件就行了。如果是我做,目前我会这样设计:
1.UI第一次呈现给客户的时候,我会触发生成一个随机数。
这时客户只需要输入他看到的随机数即可,如果客户除了输入随机数之外,没做其他任何动作,这个随机数不会再次产生。
2.用户输入随机数,并且点击了“验证”按钮之后,当代码判断到随机数验证不通过时,我会触发生成一个随机数(如果验证通过就不需要了)。
这时是要求客户重新输入后验证。
3.用户看不清随机数,点击了“重新生成随机数”按钮之后,我会触发生成一个随机数。我估计一般应该是上面三种情况会触发随机数的重新生成,其他时候不应该主动产生随机数,否则就会出现lz你说的问题了。
不应该放在pageload里,我不知道你的pageload具体是什么,但是感觉应该是UI上的某页面的加载事件。如果是这样的话,随机数的产生就不应该放在pageload里。界面应用程序最忌讳的就是UI和业务逻辑耦合的太强,这样不但代码不能复用,而且也不易维护。建议lz把随机数的生成单独封装成一个独立的方法,这样你的调用就方便了,而且这个随机数的产生规则最基本应该包括我11楼里的三种情况,如果你的需求复杂的话,可能还应该有更多要考虑到的情况。
这么写也是有问题的,==比较的是Text引用,不是Text引用的字符串的值
改成if(testquestion.Text.Equal(testanswer.Text))就可以了
用Equal肯定没问题,但是关于兄弟说的“==”的问题,确实没看懂。
另外,Equal并非时刻好用的,在TextBox.Text上没啥问题,但是其他情况下,有可能某对象属性本身就为null,这个时候如果未作保护就直接使用x.Equal的话,是会出问题的,而这时使用“==”来判断却是不会出现异常的,这个现象skyparty兄弟怎么看呢?
对于引用类型 string str; 变量str代表的是字符串的引用(可以当成地址理解),而不是字符串的内容.
比如
string str1=new string("abc");
string str2=new string("abc");
str1和str2虽然内容相同,但他们引用的不是堆中的同一块地址
所以str1!=str2
而str1.equal(str2)为真
而null作为一个值,可以用于==比较
解决null.Equal异常的方法有2种
1. "常量字符串".Equal(str)
2. str!=null&&str.Equal(str)
这个问题又跑到值类型和引用类型的讨论上来了,呵呵。从理论上讲:string肯定是引用类型,如兄弟所说的,没错。但是string是一种特殊的引用类型,它有时表现出值类型的特征。因为编程者在使用string的时候,其实潜意识中是当成值类型在使用的,我不知道我这个说法你是否认可,但是我感觉ms对于string的处理确实是这样的。从现象上讲:skyparty你从地址方面判断str1!=str2,这个没啥说的,同意,毕竟是引用类型嘛。但是在代码里面str1==str2得到的结果是true,这点你认可么?所以string还是具有值类型的特征的,而且这个也是编程者使用的习惯,呵呵。
和运行期的处理有关
为了优化,节省空间,有时会让2个引用相同内容的字符串变量指向同一个字符串常量,这时候str1==str2为真
但这个优化不是必须的,所以用==来比较字符串,不一定能得到正确结果
能举一个str1!=str2的应用场景么?我试一下,因为平时自己对string的比较都是直接使用“==”判断的,如果确实有兄弟说的这个情况,我也及时改正这个毛病,呵呵。