ASP.NET относительные пути MVC

97
задан Chris 29 January 2013 в 17:22
поделиться

6 ответов

Попробуйте это:

<script type="text/javascript" src="<%=Url.Content("~/Scripts/jquery-1.2.6.js")%>"></script>

Или использование MvcContrib и делают это:

<%=Html.ScriptInclude("~/Content/Script/jquery.1.2.6.js")%>
92
ответ дан Tim Scott 24 November 2019 в 05:26
поделиться

В ASP.NET я обычно использую <img src='<%= VirtualPathUtility.ToAbsolute("~/images/logo.gif") %>' alt="Our Company Logo"/>. Я не вижу, почему аналогичное решение не должно работать в ASP.NET MVC.

6
ответ дан David Kemp 24 November 2019 в 05:26
поделиться
<script src="<%=ResolveUrl("~/Scripts/jquery-1.2.6.min.js") %>" type="text/javascript"></script>

то, что я использовал. Путь изменения для соответствия примеру.

6
ответ дан Jesper Palm 24 November 2019 в 05:26
поделиться

Если это имеет значение я действительно ненавижу идею замусорить мое приложение тегами сервера только для разрешения путей, таким образом, я провел немного больше исследования и решил использовать что-то, что я попробовал прежде за перезапись ссылок - фильтр ответа. Таким образом я могу снабдить префиксом все полные пути известный префикс и заменить его во времени выполнения с помощью Ответа. Объект фильтра и не должен волноваться о ненужных тегах сервера. Код отправляется ниже в случае, если он поможет кому-либо еще.

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("</html>", 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);
        }
    }
}
5
ответ дан Chris 24 November 2019 в 05:26
поделиться

Как и Крис, я действительно терпеть не могу помещать раздутые серверные теги в мою чистую разметку просто для того, чтобы указать глупой штуке, чтобы она смотрела от корня вверх. Это должно быть очень простой и разумный вопрос. Но я также ненавижу мысль о необходимости писать какие-либо собственные классы C #, чтобы делать такую ​​простую вещь, зачем мне это нужно? Какая трата времени.

Для меня я просто пошел на компромисс в отношении «совершенства» и жестко запрограммировал имя корневого пути виртуального каталога внутри своих ссылок на пути. Примерно так:

<script type="text/javascript" src="/MyProject/Scripts/jquery-1.2.6.js"></script>

Для разрешения URL-адреса не требуется никакой обработки на стороне сервера или кода C #, что лучше всего для производительности, хотя я знаю, что в любом случае это будет незначительно. И никакого раздутого уродливого серверного хаоса в моей красивой чистой разметке.

I '

1
ответ дан 24 November 2019 в 05:26
поделиться

Я использовал немного другой подход, основанный на аналогичном сообщении SO, но с гораздо меньшим количеством кода ...

http: //a.shinynew.me/post/6042784654/relative-paths-in-asp-net-mvc-javascript

1
ответ дан 24 November 2019 в 05:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: