Master page Path (MasterPage 路径)
  TnD0WQEygW8e 2023年11月09日 49 0

MasterPage路径
关于masterpage中图片路径的问题,
如果引用相对路径那么会出现如果继承了masterpage的其他页面出现了目录分级情况的话引用不到图片。
如果运用绝对路径~/XXX.gif那么当挂在了虚拟目录下的时候也会出现问题
一个解决方法是在APP_CHEME目录下建立一个css文件,在其中运用

.HideBar

{    

     background: url();

}


然后在模板标签中需要引用图片的地方中引用class="HideBar",这样在模版计算路径的时候会从css路径开始计算而css路径总是固定的所以可以避免继承的时候所出现的混乱,而在虚拟目录下由于路径是从下往上计算的所以也不会出现问题
------------------
 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的大小写问题,我们指定的虚拟目录名称可能是大小写字母都有的,而用户录入的就是另外一回事情了,很可能全部是小写的。
------------------
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();       

}

接下来我们只需要在相应的元素和控件的cssclass中填入HideBar,就可以做到每个继承MasterPage或使用用户控件的页面都能正确显示图片了。
我想应该还有其它更好的办法,也希望有人能指点一二。
——Robin Lu's Blog
------------------
    .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中均使用 ~/ 开头的地址,继承自它的其他页面都可以获得正确的绝对地址了。

------------------


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";

------------------

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);

}
------------------

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月09日 0

暂无评论

推荐阅读
  wURKzOHw9Irf   2023年12月24日   34   0   0 icohtmlicoHTML
  8l4CZpTOKa7P   2023年12月26日   44   0   0 htmlhtml
  dwHry2iKGG0I   2023年12月26日   33   0   0 htmlhtmlgithubgithub
TnD0WQEygW8e