服务器控件与Html控件属性值的解释差异
2010-09-26 23:51
211 查看
最近在使用服务器控件与Html控件绑定数据时老是犯错误,皆因对两者的区别不甚了解。
众所周知,Html控件,如<a>、<img>等,要访问文件路径只能使用相对路径,如要访问根目录images文件夹中的一张图片,必须使用相对路径,如
<img src=”http://images.cnblogs.com/a.gif” />,对于<img src=”~/images/a.gif”/>是访问不到路径的,如果在一个用户控件中使用了<a>、<img>等标签,而这个用户控件又被多个文件夹中的文件引用,那么许多的链接与图片路径都会出错,这时最好可以使用服务器控件,因为服务器控件能够识别根目录访问符“~/”,它会根据不同的目录结构生成相对根目录不同的相对路径,如
<asp:HyperLink runat="server" ID="hl1" Target="_blank" Text=”链接1” NavigateUrl=”~/default.apx” />
<asp:Image ImageUrl="~/App_Themes/a.png" runat="server"/>
不论这两个标签写在哪个文件里,都能正确地访问到文件地址,但不要忘了写runat=”server”,呵呵。
但在绑定数据时,可要注意了,比如HyperLink 与 a 绑定一个超链接是不同的,如错误写法:
<asp:HyperLink runat="server" ID="hlInfoTitle" Target="_blank" Text='<%# Bind("Title") %>'
NavigateUrl='~/Modules/Sysmgr/InformationView.aspx?informationID=<%# Eval("informationID")%>' ></asp:HyperLink>
然而,a标签却可以这样写
<a id="hlInfoTitle" Target="_blank" href='/Modules/Sysmgr/InformationView.aspx?informationID=<%# Eval("informationID")%>' >链接1</a>
这是为什么呢?这是因为服务器控件的属性是在服务器端解释的,'~/Modules/Sysmgr/InformationView.aspx?informationID=<%# Eval("informationID")%>' 会被当成一个字符串解释,所以<%# Eval("informationID")%>绑定不了数据,正确的写法如下:
<asp:HyperLink runat="server" ID="hlInfoTitle" Target="_blank" Text='<%# Bind("Title") %>'
NavigateUrl='<%# "~/Modules/Sysmgr/InformationView.aspx?informationID="+Eval("informationID").ToString()%>' ></asp:HyperLink>
同理,访问后台的变量,解释也有差异,如调用一个JS函数要传递后台的变量值,Html控件可以这样写,
<input type=”button” OnClick=”fun('<%= type %>’)" />
但服务器控件却不行,如
<asp:Button ID="button1" OnClientClick=”fun('<%= type %>’)" runat="server" />
fun('<%= type %>’)只会被当成一个字符串解释,正确的写法是
<asp:Button ID="btn_Course" OnClientClick='<%# "fun(\""+type+"\")" %>' runat="server" />
另外注意,凡是在前台使用<%# %>绑定了后台变量,必须要在后台调用DataBind()方法,如Page.DataBind()。
众所周知,Html控件,如<a>、<img>等,要访问文件路径只能使用相对路径,如要访问根目录images文件夹中的一张图片,必须使用相对路径,如
<img src=”http://images.cnblogs.com/a.gif” />,对于<img src=”~/images/a.gif”/>是访问不到路径的,如果在一个用户控件中使用了<a>、<img>等标签,而这个用户控件又被多个文件夹中的文件引用,那么许多的链接与图片路径都会出错,这时最好可以使用服务器控件,因为服务器控件能够识别根目录访问符“~/”,它会根据不同的目录结构生成相对根目录不同的相对路径,如
<asp:HyperLink runat="server" ID="hl1" Target="_blank" Text=”链接1” NavigateUrl=”~/default.apx” />
<asp:Image ImageUrl="~/App_Themes/a.png" runat="server"/>
不论这两个标签写在哪个文件里,都能正确地访问到文件地址,但不要忘了写runat=”server”,呵呵。
但在绑定数据时,可要注意了,比如HyperLink 与 a 绑定一个超链接是不同的,如错误写法:
<asp:HyperLink runat="server" ID="hlInfoTitle" Target="_blank" Text='<%# Bind("Title") %>'
NavigateUrl='~/Modules/Sysmgr/InformationView.aspx?informationID=<%# Eval("informationID")%>' ></asp:HyperLink>
然而,a标签却可以这样写
<a id="hlInfoTitle" Target="_blank" href='/Modules/Sysmgr/InformationView.aspx?informationID=<%# Eval("informationID")%>' >链接1</a>
这是为什么呢?这是因为服务器控件的属性是在服务器端解释的,'~/Modules/Sysmgr/InformationView.aspx?informationID=<%# Eval("informationID")%>' 会被当成一个字符串解释,所以<%# Eval("informationID")%>绑定不了数据,正确的写法如下:
<asp:HyperLink runat="server" ID="hlInfoTitle" Target="_blank" Text='<%# Bind("Title") %>'
NavigateUrl='<%# "~/Modules/Sysmgr/InformationView.aspx?informationID="+Eval("informationID").ToString()%>' ></asp:HyperLink>
同理,访问后台的变量,解释也有差异,如调用一个JS函数要传递后台的变量值,Html控件可以这样写,
<input type=”button” OnClick=”fun('<%= type %>’)" />
但服务器控件却不行,如
<asp:Button ID="button1" OnClientClick=”fun('<%= type %>’)" runat="server" />
fun('<%= type %>’)只会被当成一个字符串解释,正确的写法是
<asp:Button ID="btn_Course" OnClientClick='<%# "fun(\""+type+"\")" %>' runat="server" />
另外注意,凡是在前台使用<%# %>绑定了后台变量,必须要在后台调用DataBind()方法,如Page.DataBind()。
相关文章推荐
- 服务器控件与Html控件属性值的解释差异
- 服务器控件-发送web控件的html属性
- js获取服务器控件属性值方法
- 获得服务器控件生成的HTML的方法
- HTML 服务器控件
- WEB服务器控件对应生成的HTML标签 及最常应用事例
- 简述HTML控件与Web服务器控件的区别
- HTML跟asp.net的服务器控件ListBox一样的功能
- 将服务器控件在后台生成html
- Web服务器控件与Html控件的区别
- 如何在VS2008中将HTML控件转换为服务器控件
- asp.net的优化 服务器控件背后友好的Html和JS
- 服务器控件和html控件区别
- 获取gridview前台绑定的服务器控件属性值
- ASP.NET的SEO: 服务器控件背后——SEO友好的Html和JavaScript
- Web服务器控件、Html服务器控件和Html控件
- HTML 服务器控件
- 将服务器控件在后台生成html
- 不错的下拉列表.HTML控件和服务器控件都可以使用
- ASP.NET Web Forms - HTML 服务器控件