111,128
社区成员
发帖
与我相关
我的任务
分享


Page.ResolveUrl("~/site1/dir1/default.aspx?a=1");这类计算,最终在运行时产生了准确的路径。
而 html 方式的”绝对路径、相对路径“都不是运行时计算出来的,因此不是动态的,不保证准确。因此asp.net 的 ~/ 打头的这种路径规格,既不是相对路径,也不是绝对路径,而是asp.net 特有的动态路径。它必须经过 asp.net 的解析和计算才能输出到 html 中。
你可以看看你的代码,那些路径是 asp.net 控件机制所要解析的路径吗?asp.net 将你随便任意写的字符串,原样输出到 html 中,那么这些就不可能被 asp.net 解析。
你可以选择 asp.net 控件来生成这些连接。如果你要随便写一些字符串而已,那么你自己要调用 ResolveUrl 函数来动态产生准确的 url,并且拼接(使用 <%= %> 的语法形式)入你的 html 中。
<a href ="~/subpage.aspx?ID=1" target="_blank">部门动态</a>应该改为<a href ="subpage.aspx?ID=1" target="_blank">部门动态</a>就行了,<a href='<% =GetUrl("~/subpage.aspx?ID=2") %>' sdaf-%&3 >>< target="_blank">师资建设</a>那么asp.net也不会去进行语法检查,只会原样输出而已。但是asp.net会帮你计算<% = %>表达式。实际上在 asp 中就支持它了,在 asp.net 中照样支持,你因此可以调用 Page.ResolveUrl 函数来动态产生准确的 url 地址。
尽管有一些培训教师一味地推什么复杂繁琐异常的 asp.net mvc “模式”,或者什么”不用控件“之类的口号,实际上要是从效率方面来说,你只要学好基本的原理就行了,在这个例子中,使用 asp.net 控件跟不使用控件,在开发效率和运行效率上,没有半点差别,只会让开发效率保证得到提高(而不是繁琐和低效的分层模式)。<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<ul>
<li><a>首页</a></li>
<li>
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/subpage.aspx?ID=1">部门动态</asp:HyperLink>
</li>
<li>
<a href='<% =GetUrl("~/subpage.aspx?ID=2") %>' target="_blank">师资建设</a>
</li>
<li>
<a href="~/subpage.aspx?ID=3" target="_blank">机构职能</a>
</li>
<li>
<a href="~/subpage.aspx?ID=4" target="_blank">人才招聘</a>
</li>
<li>
<a href="~/subpage.aspx?ID=5" target="_blank">规章制度</a>
</li>
<li>
<a href="~/subpage.aspx?ID=6" target="_blank">办事指南</a>
</li>
<li>
<a href="~/subpage.aspx?ID=7" target="_blank">下载专区</a>
</li>
</ul>
</div>
</form>
</body>
</html>
using 和命名空间部分(如果有的话),请自己添加。
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected string GetUrl(string u)
{
return this.Page.ResolveUrl(u);
}
你可以看到,在你的那种代码中写成 subpage.aspx?ID=1 或者 /subpage.aspx?ID=1 都跟最终的 asp.net 程序输出到 html 中的东西完全不一样。因为asp.net 下的页面可能移动到任何子目录下,而且 asp.net 网站也可能安装到 iis 任何虚拟子目录下,并且你的这种路径的宿主可能是用户控件、自定义控件、母板页等等,那么不论是相对路径还是绝对路径,都不是 asp.net 的写法!
要搞懂 asp.net 的路径,必定是要写成 ~/ 开头的路径。但是要知道 asp.net 如何计算这种路径的机制。