Master page Path (MasterPage 路径)

MasterPage路径
------------------

From: http://hi.baidu.com/%B7%E7%D3%EA%B9%CA%C8%CB/blog/item/897ac13582b06c1090ef39e3.html
关于masterpage中图片路径的问题,
如果引用相对路径http://www.cnblogs.com/XXX.gif那么会出现如果继承了masterpage的其他页面出现了目录分级情况的话引用不到图片。
如果运用绝对路径~/XXX.gif那么当挂在了虚拟目录下的时候也会出现问题
一个解决方法是在APP_CHEME目录下建立一个css文件,在其中运用
.HideBar
{    
     background: url(http://www.cnblogs.com/pic/custom_images/delval_top_new.jpg);
}
然后在模板标签中需要引用图片的地方中引用class="HideBar",这样在模版计算路径的时候会从css路径开始计算而css路径总是固定的所以可以避免继承的时候所出现的混乱,而在虚拟目录下由于路径是从下往上计算的所以也不会出现问题
------------------
From:http://www.cnblogs.com/lijunming/articles/522747.html
 ASP.Net 2.0 MasterPage中路径的处理
用VS.Net2005开发ASP.Net 2.0应用程序时,提出了MasterPage的概念,相当于模板。
在一个MasterPage中设定文件的路径,当不在相同目录下的文件使用这个MasterPage时对该路径的链接会出问题,此时使用相对路径是不适宜的。
可以使用下面的方法进行处理:
string _url = Page.Request.Url.ToString();
string _ret = _url.Substring(0, _url.ToLower().IndexOf("/你的虚拟目录名称/", 0)) + "/你的虚拟目录名称/";
这样得到的_ret即为Web项目的绝对路径,可以在此基础上添加对项目中任何文件路径的链接。
使用ToLower()方法是为了避免Url的大小写问题,我们指定的虚拟目录名称可能是大小写字母都有的,而用户录入的就是另外一回事情了,很可能全部是小写的。
------------------
From: http://www.ninedns.com/asp.net/2007102520419.html
ASP.NET MasterPage 中图片路径的解决办法
一般而言,链接路径的表达有三种方式:绝对路径、相对路径和基于根目录的路径。另外对于ASP.NET服务器控件来说,还可以使用“~”来代替根目录来表示。
在MasterPage和用户控件中,经常要使用一些图片作为背景或漂亮的按钮,但是在指定图片的src或者background时候,经常因为链接路径的问题而出错。
1.使用绝对路径:使用形如“D:"xxx"xxx.gif”的绝对文件路径一般情况下是不可取的。可以考虑采取url的方法,写成http://xxxx/xx/xxx.gif”。但是缺点是不利于移植,例如现在站点的地址为http://www.xxx.net,如果有一天站点更该http://www.xxx.com,则所有的链接地址都失效,需要进行更改,难以维护。
2. 使用相对路径:使用相对于页面位置的路径,比如“.."images"xxx.gif”,这样MasterPage和用户控件中都能正确显示,但是如果将继承MasterPage的页面放到不同的文件夹下,或者使用用户控件的页面不在同一文件夹,那么该页面又会找不到正确的图片位置了!
3.基于根目录的路径:形如:<a href="/xxx/xxx.gif">这样的解决方法在ASP.NET2.0调试的时候,因为没有建立虚拟目录,并不能正确显示(我也不是很肯定,没有确认^_^)。而我在非服务器控件的HTML标签元素上无法使用“~”来指定路径。
那么,在设计时让图片可见,我们应该怎么来处理呢?我采用了CSS来完成这项工作。针对要显示图片的元素和控件,我们可以写一段简单的css来定位图片,因为css文件的位置是一般不会改变的(位于 App_Theme/themename/xxx.css),这种方法也就行之有效了。
.HideBar
{
    height:56px;
    width:5px;
    cursor:hand;
    background-image: url(http://images.cnblogs.com/xxx.gif);       
}接下来我们只需要在相应的元素和控件的cssclass中填入HideBar,就可以做到每个继承MasterPage或使用用户控件的页面都能正确显示图片了。
我想应该还有其它更好的办法,也希望有人能指点一二。
——Robin Lu's Blog
------------------
From: http://superkam.blog.163.com/blog/static/228256482008316560726/
    .NET 2.0的MasterPage相当方便,但是如果不同路径的页面引用MasterPage的话,在MasterPage中设置的相对路径会发生错误。比如 MasterPage路径为 domain/TestMasterPage.master ,而MasterPage中引用了一个相对地址 ../admin/Default.aspx  ,如果 domain/admin/Test.aspx 继承自这个MasterPage的话,继承后的 Test.aspx 页面中的地址会变成 domain/admin/admin/Default.aspx ,这不是我们想要的。当然可以用 <%=ResolveClientUrl("~/admin/Default.aspx ") %> 的方式取回绝对地址,不过链接过多的话这样写也很麻烦。
    解决这个问题可以通过编写一个页面基类,在基类中识别地址并自动转换。以下是基类代码。
public abstract class PageBase : Page   
    {  
        protected override void Render(HtmlTextWriter writer)  
        {  
            StringWriter stringWriter = new StringWriter();  
            HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);  
            base.Render(htmlWriter);  
            string html = stringWriter.ToString();      
   
            #region 转换相对路径  
            MatchCollection collection = Regex.Matches(html, "<(a|link|img|script|input|form).[^>]*(href|src|action)=(""""|’|)(.[^""""’]*)(""""|’|)[^>]*>", RegexOptions.IgnoreCase);  
 
            foreach (Match match in collection)  
            {  
                if (match.Groups[match.Groups.Count - 2].Value.IndexOf("~") != -1)  
                {  
                    string url = this.Page.ResolveUrl(match.Groups[match.Groups.Count - 2].Value);  
                    html = html.Replace(match.Groups[match.Groups.Count - 2].Value, url);  
                }  
            }  
            #endregion  
            writer.Write(html);      
        }      
    }
    基类做好后,让刚才的 domain/admin/Test.aspx 页面继承这个基类(MasterPage不用继承它),在页面中只要出现 ~/ 开头的地址,都会自动转换成绝对地址(~/admin/Default.aspx 将被自动转换成 domain/admin/Default.aspx)。这样在MaterPage中均使用 ~/ 开头的地址,继承自它的其他页面都可以获得正确的绝对地址了。
------------------
From: http://forums.asp.net/t/1054133.aspx
Specifying javascript file path on Master pages
<link runat="server" href="~/scripts/myfile.js" />
<script type="text/javascript" src='<%=ResolveUrl("~/swfobject.js")%>'></script>
------------------
From: http://mosalem.blogspot.com/2006/07/master-page-and-content-page-path-in.html
if (Request.CurrentExecutionFilePath.ToLower().Contains("/admin/"))
{
  //not in the same folder
  boddy.Style[HtmlTextWriterStyle.BackgroundImage] = "../images/bg.gif";
}
else
  boddy.Style[HtmlTextWriterStyle.BackgroundImage] = "images/bg.gif";
------------------
From: http://www.codeverge.net/ng.asp-net-forum.master_pages_themes_and_navigation_controls/masterpage-path-for-scripts
1. for css
  <link runat="server" href="~/css/css.css" rel="stylesheet" type="text/css" />
2. for javascript, check following thread
  http://forums.asp.net/thread/1390505.aspx
------------------
From: http://www.csharper.net/blog/using_the_tilde__~__in_asp_net_everywhere___not_just_controls_.aspx
Using the Tilde ( ~ ) in ASP.NET Everywhere - Not Just Controls!
protected override void Render(HtmlTextWriter writer)
{
    MemoryStream ms = new MemoryStream();
    StreamWriter sw = new StreamWriter(ms);
    HtmlTextWriter htw = new HtmlTextWriter(sw);

    base.Render(htw);
    htw.Flush();
    ms.Position = 0;

    TextReader tr = new StreamReader(ms);
    string output = tr.ReadToEnd();
    string newOutput = ReplaceWithAppPath(output);
    writer.Write(newOutput);
    
    htw.Close();
    sw.Close();
    ms.Close();
}

public static string ReplaceWithAppPath(string str)
{
    string appPath = HttpContext.Current.Request.ApplicationPath;

    //Ensure the app path ends w/ a slash
    if(!appPath.EndsWith("/"))
        appPath += "/";

    return str.Replace("~/", appPath);
}
------------------

你可能感兴趣的:(master)