Использование скриптов на главной странице с ASP.NET MVC - PullRequest
68 голосов
/ 07 декабря 2008

Я довольно новичок в ASP.NET MVC, и у меня возникли небольшие проблемы со скриптами ... в частности, я хочу использовать jQuery на большинстве страниц, поэтому имеет смысл поместить его на главную страницу , Однако, если я делаю (из моего ~/Views/Shared/Site.Master):

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

Тогда это буквально то, что сводится к клиенту - что, конечно, работает, только если наш текущий маршрут имеет правильное количество уровней. Начиная с ~/Scripts/... не работает. Начиная с /Scripts/... будет работать, только если проект находится в корне сайта (что я не хочу предполагать).

У меня есть один рабочий подход (я опубликую ниже) - но: я что-то упустил?

Я бы предпочел не привлекать диспетчер сценариев, поскольку это, кажется, лишает простоты модели ASP.NET MVC ... или я слишком беспокоюсь?

Вот как я могу заставить его работать, который работает также для нетривиальных виртуальных машин - но это кажется слишком сложным:

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

Ответы [ 11 ]

45 голосов
/ 07 декабря 2008

У меня есть класс AppHelper с некоторыми методами для добавления ссылок на скрипты:

public static string ReferenceScript(string scriptFile)
{
    var filePath = VirtualPathUtility.ToAbsolute("~/Scripts/" + scriptFile);
    return "<script type=\"text/javascript\" src=\"" + filePath + "\"></script>";
}

так что на главной странице вы можете использовать:

<%= AppHelper.ReferenceScript("jquery-1.2.6.js") %>
36 голосов
/ 02 июля 2009

Я думаю, что самый простой способ - использовать следующее, и оно работает в представлениях.

<script type="text/javascript" src="<%=ResolveUrl("~/Scripts/myscript.js") %>">

</script>
20 голосов
/ 07 декабря 2008

На основании других ответов, возможно, метод расширения на Html (который очень распространен для MVC), аналогичный ответу Эдуардо:

 <%=Html.Script("~/Scripts/jquery-1.2.6.js")%>

С:

public static string Script(this HtmlHelper html, string path)
{
    var filePath = VirtualPathUtility.ToAbsolute(path);
    return "<script type=\"text/javascript\" src=\"" + filePath + "\"></script>";
}
10 голосов
/ 07 декабря 2008

Почему бы просто не указать свою главную страницу на хостинге файлов js от Google ? Тогда даже когда дело доходит до развертывания (при условии, что ваш сайт работает в сети), вы можете злоупотреблять, возможно, предварительно кэшированными файлами jquery?

4 голосов
/ 07 декабря 2008

Я сделал кое-что из того, о чем упоминал OJ, я создал класс GoogleHelper с помощью этих методов

public static string ReferenceGoogleAPI()
{
    var appSettings = new AppSettingsReader();
    string apiKey = appSettings.GetValue("GoogleApiKey", typeof(string)).ToString();
    return ReferenceGoogleAPI(apiKey);
}

public static string ReferenceGoogleAPI(string key)
{
    return "<script type=\"text/javascript\" src=\"http://www.google.com/jsapi?key=" + key + "\"></script>";
}

public static string ReferenceGoogleLibrary(string name, string version)
{
    return "<script type=\"text/javascript\">google.load(\"" + name + "\", \"" + version + "\");</script>";
}

Теперь я добавляю дополнительные методы для получения данных ClientLocation;)

1 голос
/ 19 декабря 2012

Я просто использую косую черту (/). Например:

<script src="/Script/jquery-1.4.1.js"></script>

когда файл "jquery-1.4.1.js" находится в каталоге Script root. И это прекрасно работает.

1 голос
/ 14 декабря 2011

Вы должны взглянуть на использование утилиты, например, нажать ее. Он может собирать и скрывать все ваши файлы CSS и JS для вас. Или вы можете использовать его для генерации тегов скрипта, если вы просто продолжаете отладку с помощью ForceDebug ()

http://www.codethinked.com/squishit-the-friendly-aspnet-javascript-and-css-squisher

1 голос
/ 29 апреля 2010

ResolveUrl - самое элегантное решение IMO. Хотя это позор, URL-адреса CSS решаются с помощью runat = server, а не сценария.

1 голос
/ 16 января 2009

На работе мы делаем что-то вроде этого из кода ASP:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  Const jQuery As String = "jQuery"

  With Me.Page.ClientScript
    If Not .IsClientScriptIncludeRegistered(jQuery) Then
      .RegisterClientScriptInclude(jQuery, VirtualPathUtility.ToAbsolute("~/Includes/jQuery-1.2.6.js"))
    End If
  End With
End Sub

Я не знаю, возможно ли это сделать с помощью ASP.NET MVC.

0 голосов
/ 01 сентября 2012

Вы можете попробовать метод расширения Url.Content с синтаксисом Razor

<script src="@Url.Content("~/Scripts/jquery.min.js")" type="text/javascript"></script>
...