在asp.net框架里,mvc框架是我了解的使用最方便、设计最合理的框架。特别是它从架构上提供了很多实用的工具,其中之一便是HtmlHelper,它将程序员从写表单控件标签的繁琐工作中解放出来,同时也减少了服务器端代码与客户端代码搅在一起的局面。HtmlHelper甚至可以帮助我们自动加载对象,为某些表单赋值。我今天就碰到了这样的情况,发生在我把一个隐藏字段命名为“Url ”之后。问题的发生及解决过程如下,我宁愿相信是我对MVC还没有弄明白,还不是MVC自作聪明。

  本文的说明都采用先图后文的方式行文,请注意图中用红色框起来的代码部分。

 

   上图说明:在一个项目中,我需要将一条网页的url去掉域名后保存起来,然后再把去掉域名的url地址子字符串写到客户端表单中。如图所示,我准备将它取名为"Url"。(注:为了更加方便地显示在网页上让我抓图,我把它改成了TextBox。)

   我怀着无比兴奋的心情,期待在客户端显示的结果为:"/main.html"。

   上图说明:我真不敢相信自己的眼睛,由于客户端的域名正是leader.jxcn.cn(我改了自己的hosts,将这个域名指向本机),MVC竟有自动解析相对url地址的能力?我于是开始检查,是不是我的代码写错了?发现写法没有错。

  于是我想了半天,决定:调试,是不是我的代码运行到这里时发生了不可思议的事?

  上图说明:我在构建模型对象的代码处下了断点,开始调试,果然程序运行到这里时停下来了。我小心翼翼地检查对像各个属性值。不过:newsUrl属性的值正是我想要的:/main.html。

  我决定让自己冷静下来,于是我站到窗边,打开窗户,看着楼下变得细微的熙熙攘攘的行人。我的人生很快又过了五分钟零八秒,此时我决定做最后一搏:将这个表单控件改名再试。

  上图说明:我开始移动鼠标,定位到这个HtmlHelper方法里,将变量名Url变为NewsUrl。接着我抱着最后一丝梦想,等待着运行结果。在结果页显示出来之前,我不停地问自己,这样能行吗?我脑海中的另一个小人跳出来说:死马当活马医吧。
 
   上图说明:看到这个结果,我差点要流出幸福的眼泪来。同样的对象,改一个名字竟能得出两个不同的结果来?不管如何,我得到了正确的执行结果。
  问题得到彻底解决,可是我没有停下来。我在想之前错误的url地址到底是什么?我决不相信是MVC自动帮我把相对地址转化绝对完整的url地址了。我几乎可以肯定(如果不是这样请留言告诉我):HtmlHelper将Request.Url的值,也就是我修改后的本机页面的URL来进行填充了。
  看来,HtmlHelper 在“没有经得我同意”的情况下,擅自将数据源修改成了其它的值。不过,我仍相信HtmlHelper是善意的,只不过它能先检查一下我有没有指定数据源对象再做这件事,就更完美了。
  最后的忠告,
如无必要,请不要将控件的变量名设为Url或其他系统内置的变量名称。
 

 

 posted on 2011-05-18 22:25  吴辉军  阅读(3463)  评论(17编辑  收藏  举报