当前位置:  开发笔记 > 编程语言 > 正文

ASP.NET MVC相对路径

如何解决《ASP.NETMVC相对路径》经验,为你挑选了6个好方法。

在我的应用程序中,我经常需要使用相对路径.例如,当我引用JQuery时,我通常这样做:


现在我正在转换到MVC,我需要考虑页面可能具有的相对于根的不同路径.这当然是过去URL重写的问题,但我设法通过使用一致的路径来解决它.

我知道标准解决方案是使用绝对路径,例如:


但这对我来说不起作用,因为在开发周期中,我必须部署到应用程序将在虚拟目录中运行的测试机器上.根更改时,根相对路径不起作用.此外,出于维护原因,我不能简单地在部署测试期间更改所有路径 - 这本身就是一场噩梦.

那么什么是最好的解决方案?

编辑:

由于这个问题仍在接收观点和答案,我认为更新它可能是谨慎的,因为从Razor V2开始,支持根相对网址,所以你可以使用


没有任何服务器端语法,视图引擎自动替换〜/当前站点根目录.



1> Tim Scott..:

试试这个:


或者使用MvcContrib并执行以下操作:

<%=Html.ScriptInclude("~/Content/Script/jquery.1.2.6.js")%>


(我知道这篇文章很旧)-不使用<%= Url.Content(“〜/ Scripts / jquery-1.2.6.js”)%>使服务器呈现路径,但是,如果您使用“ / Scripts / jquery-1.2.6.js”,它将直接提供给客户端,因此,减少了服务器要做的一件事?我以为我读的内容越多,可以避免使用服务器进程越好-尤其是对于* .js路径等静态内容?我意识到这使用了最少的资源,但是如果您的应用程序中有成百上千的Url.Content(),那将节省几纳秒,不是吗?

2> Charles Burn..:

虽然是一篇旧帖,新读者应该知道Razor 2及更高版本(MVC4 +中的默认值)完全解决了这个问题.

使用Razor 1的旧MVC3:

Application home page

使用Razor 2和更高版本的新MVC4:

Application home page

没有笨拙的Razor函数式语法.没有非标准的标记标记.

使用波形符('〜')在任何HTML属性中添加路径,通过替换正确的路径告诉Razor 2"只使其工作".这很棒.


我经常发现设计越简单,就越有想法.

3> Simon_Weaver..:

突破性的变化 - MVC 5

注意MVC 5中的重大变化(来自MVC 5发行说明)

Url Rewrite和Tilde(〜)

升级到ASP.NET Razor 3或ASP.NET MVC 5后,如果使用URL重写,则波形符(〜)表示法可能无法正常工作.的URL重写影响HTML元素,如波浪线(〜)表示法 ,

是我用过的.更改路径以匹配您的示例.



6> Chris..:

对于它的价值,我真的很讨厌用服务器标签乱扔我的应用只是为了解决路径,所以我做了一些研究,并选择使用我之前尝试过的重写链接 - 响应过滤器.通过这种方式,我可以使用已知前缀为所有绝对路径添加前缀,并在运行时使用Response.Filter对象替换它,而不必担心不必要的服务器标记.代码发布在下面,以防它可以帮助其他任何人.

using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;

namespace Demo
{
    public class PathRewriter : Stream
    {
        Stream filter;
        HttpContext context;
        object writeLock = new object();
        StringBuilder sb = new StringBuilder();

        Regex eofTag = new Regex("", RegexOptions.IgnoreCase | RegexOptions.Compiled);
        Regex rootTag = new Regex("/_AppRoot_", RegexOptions.IgnoreCase | RegexOptions.Compiled);

        public PathRewriter(Stream filter, HttpContext context)
        {
            this.filter = filter;
            this.context = context;
        }

        public override void Write(byte[] buffer, int offset, int count)
        {
            string temp;

            lock (writeLock)
            {
                temp = Encoding.UTF8.GetString(buffer, offset, count);
                sb.Append(temp);

                if (eofTag.IsMatch(temp))
                    RewritePaths();
            }
        }

        public void RewritePaths()
        {
            byte[] buffer;
            string temp;
            string root;

            temp = sb.ToString();
            root = context.Request.ApplicationPath;
            if (root == "/") root = "";

            temp = rootTag.Replace(temp, root);
            buffer = Encoding.UTF8.GetBytes(temp);
            filter.Write(buffer, 0, buffer.Length);
        }

        public override bool CanRead
        {
            get { return true; }
        }

        public override bool CanSeek
        {
            get { return filter.CanSeek; }
        }

        public override bool CanWrite
        {
            get { return true; }
        }

        public override void Flush()
        {
            return;
        }

        public override long Length
        {
            get { return Encoding.UTF8.GetBytes(sb.ToString()).Length; }
        }

        public override long Position
        {
            get { return filter.Position; }
            set { filter.Position = value; }
        }

        public override int Read(byte[] buffer, int offset, int count)
        {
            return filter.Read(buffer, offset, count);
        }

        public override long Seek(long offset, SeekOrigin origin)
        {
            return filter.Seek(offset, origin);
        }

        public override void SetLength(long value)
        {
            throw new NotImplementedException();
        }
    }

    public class PathFilterModule : IHttpModule
    {
        public void Dispose()
        {
            return;
        }

        public void Init(HttpApplication context)
        {
            context.ReleaseRequestState += new EventHandler(context_ReleaseRequestState);
        }

        void context_ReleaseRequestState(object sender, EventArgs e)
        {
            HttpApplication app = sender as HttpApplication;
            if (app.Response.ContentType == "text/html")
                app.Response.Filter = new PathRewriter(app.Response.Filter, app.Context);
        }
    }
}

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有