Как вы ссылаетесь на файлы .js, расположенные в папках просмотра, со страницы, используя Asp.net MVC

Например, если у меня есть страница, расположенная в Views/Home/Index.aspx, и файл JavaScript, расположенный в Views/Home/Index.js, как вы сошлетесь на это на странице aspx?

Пример ниже не работает, хотя компилятор говорит, что путь правильный

<script src="Index.js" type="text/javascript"></script>

Точно такая же проблема была опубликована здесь более подробно: http://forums.asp.net/p/1319380/2619991.aspx

Если сейчас это невозможно, то будет ли это в будущем? Если нет, то как все управляют своими ресурсами javascript для больших проектов Asp.net MVC? Вы просто создаете структуру папок в папке Content, которая отражает структуру папок View? ОТВРАТ!


person Vyrotek    schedule 17.09.2008    source источник


Ответы (5)


Вы можете использовать метод VirtualPathUtility.ToAbsolute, как показано ниже, чтобы преобразовать относительный URL-адрес приложения файла .js в абсолютный, который можно записать на страницу:

<script type="text/javascript" src="<%=VirtualPathUtility.ToAbsolute("~/Views/Home/Index.js") %>"></script>
person Chris Pietschmann    schedule 17.09.2008
comment
Я пробовал это, и это, кажется, не работает. Он генерирует то, что, как я ожидаю, будет правильным URL-адресом, но по какой-то причине не может найти файл js. - person Vyrotek; 17.09.2008
comment
вы не можете ссылаться на файл js в этом месте, потому что конфигурация mvc препятствует этому. Вам нужно будет изменить файл web.config, чтобы разрешить загрузку файлов js из этого места. stackoverflow.com/a/24763515/489000 - person Gabriel Espinoza; 31.05.2018

У вас должна быть отдельная структура папок для скриптов. Например, папка JavaScript в корне приложения. Хранение js-файлов с представлениями не только влияет на решение проблем с путями, но также влияет на безопасность и права доступа. Кроме того, позже будет намного проще встроить JS-файлы в качестве ресурсов сборки, если вы решите в будущем развернуть некоторые части своего приложения отдельно, когда они будут храниться в выделенной подпапке.

person dimarzionist    schedule 17.09.2008

Для общих ресурсов javascript использование папки Content имеет смысл. Проблема заключалась в том, что я специально пытался решить, был ли javascript для страницы aspx, который никогда не будет использоваться повторно.

Я думаю, что мне просто нужно будет поместить javascript для страницы aspx прямо на саму страницу и сохранить общие ресурсы js в папке Content.

person Vyrotek    schedule 17.09.2008
comment
Я ищу тот же подход, что и вы. Вы нашли что-нибудь, кроме заполнения страницы или добавления в каталог содержимого? - person Owen; 09.06.2009
comment
Я только что столкнулся с этой же проблемой сегодня. Полностью согласен с вашим YUCK в исходном посте. Но помещать это на саму страницу, я считаю, еще более противно! Мои первые мысли заключались в том, что это может быть маршрутизация, которая не позволяет обслуживать файлы js в папке Views. Удалось ли вам решить эту проблему в конце концов? - person Jonathan Moffatt; 02.07.2009

Вот хороший метод расширения для HtmlHelper:

public static class JavaScriptExtensions
{
    public static string JavaScript(this HtmlHelper html, string source)
    {
        TagBuilder tagBuilder = new TagBuilder("script");
        tagBuilder.Attributes.Add("type", "text/javascript");
        tagBuilder.Attributes.Add("src", VirtualPathUtility.ToAbsolute(source));
        return tagBuilder.ToString(TagRenderMode.Normal);
    }
}

Используйте это так:

<%=Html.JavaScript("~/Content/MicrosoftAjax.js")%>
person Community    schedule 17.09.2008

Если вы перенаправляете свои страницы в пользовательский RouteHandler, вы можете проверить наличие файлов перед обработкой RequestContext в классе MvcHandler.

Пример (не полный):

public class RouteHandler : IRouteHandler
{
    public IHttpHandler 
    GetHttpHandler(RequestContext requestContext)
    {
        var request = requestContext.HttpContext.Request;

        // Here you should probably make the 'Views' directory appear in the correct place.
        var path = request.MapPath(request.Path); 
        if(File.Exists(path)) {
            // This is internal, you probably should make your own version.
            return new StaticFileHandler(requestContext);
        }
        else {
            return new MvcHandler(requestContext);
        }
    }
}
person Pablo Montilla    schedule 11.11.2011