随笔- 11  文章- 0  评论- 25  阅读- 12432 

  在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   吴辉军  阅读(3464)  评论(17编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示