runat="server" 的使用问题

做WebForm做的不多,经验也很浅,今天在做功能的时候遇到一个很棘手的问题,我添加的新页面,里面用ASPX视图引擎在页面上添加C#代码,结果它没有被解析出来,如下图所示:

是的,代码就是如上图那么写的,没毛病吧,也和其他几个页面对比过的。
结果在浏览器里显示就是上面的了,下断点跟代码,是没有问题的。
 
原因找了好久,突然感觉有个地儿不对,就改了,改了果然好了
 
去掉 runat="server" 就可以了,这个 runat="server" 这个鬼东西到底是个什么?有什么用?
 
在网上找了好久,找到这么一段说明,是这么说的:
没有加 runat="server" 的 Html标签会被直接写入Response,而有runat=“server” 的Html标签会被转换成HtmlControl子类加入到页面空间集合,按照控件的生命周期去处理,嗯,有点道理,那我是不是可以这样理解,ASPX视图引擎只会处理Response里的 Html 而不会去管Html控件的代码呢?好像还是说不通,继续找资料,询问同事,他们说他们之前也遇到过,修改后也可以了,但是至于为什么,他们也没有找到答案;好吧,求人不如求己,既然问题出在  runat="server" 以那我们一定会问,加了这个标记之后,编译的时候到底发生了什么?
    runat="server" 标记页面在编译的时候是如何解释页面上的html代码,当html标签不包含runat="server"的时候,标签会被编译成new LiteralControl()具体的文本,当遇到 runat="server"标记的标签的时候,该标签会被当做一个HtmlControl来对待,那么这个HtmlControl又是个什么鬼呢?查看了下项目代码,它引用来自System.Web这个程序集,OK那我反编译看看他源码是怎么写的,打开后果然震惊了,找到了下面这些类,下面列出的应该是可以被当做HtmlControl的标签
 
再看我的页面主要用到的是引用CSS就是Link标签,Link标签的Href属性出问题了,好吧,找一找,找到了如下代码:
base 是基类,当你每给一个Html标签添加 runat="server",在编译的时候就会自动生成一个HtmlControl类,我们看到这里的set方法,直接将页面的值赋上去了,而并没有去识别value是不是C#代码,要不要去读它真实的值。所以也就成了我页面显示的那种效果。额.....这个时候貌似才恍然大悟!当我去掉 runat="server",编译不会把标签转换为HtmlControl,同样也不会被那样去赋值了。
 
到此,貌似问题解决了,但是还有一个疑问,ASPX的页面在编译的时候是如何走的呢?这个又从哪里看.Net源码呢?
 
 
参考资料:
微软四大视图引擎介绍:http://www.infoq.com/cn/news/2010/07/Razor/
博客园极具参考价值好文:http://www.cnblogs.com/yinhaiming/articles/1530884.html
 
posted @ 2019-04-30 22:09  NCat  阅读(1416)  评论(0)    收藏  举报