Какой-нибудь умный способ сделать ссылку на путь на основе «корневого» пути в JavaScript, точно так же, как у нас ~/
в ASP.NET?
~ / эквивалент в javascript
Ответы (12)
Попросите вашу страницу сгенерировать тег с чем-то вроде:
<link rel="home" id="ApplicationRoot" href="http://www.example.com/appRoot/" />
Затем создайте функцию в JavaScript, которая извлекает значение, например:
function getHome(){
return document.getElementById("ApplicationRoot").href;
}
Используйте тег base:
<head>
<base href="http://www.example.com/myapp/" />
</head>
...
отныне любая ссылка на этой странице, будь то в javascript или html, будет относиться к базовому тегу, то есть "http://www.example.com/myapp/ ".
Вы также можете использовать функцию asp.net VirtualPathUtility
:
<script>
var basePath = '<%=VirtualPathUtility.ToAbsolutePath("~/")%>';
</script>
Примечание. Я не кодирую путь к JSON -строке (escape-кавычки, управляющие символы и т. Д.). Я не думаю, что это большое дело (кавычки, например, не допускаются без экранирования в URL-адресе), но никто никогда не знает ...
Обычно я создаю переменную в верхней части файла js и назначаю ей корневой путь. Затем я использую эту переменную при обращении к файлу.
var rootPath = "/";
image.src = rootPath + "images/something.png";
~ / - это корень приложения, а не буквальный корень, он вставляет ~ / для обозначения <YourAppVirtualDir>/
Чтобы сделать буквальный корень в JavaScript, это просто /, то есть "/root.html". В JavaScript нет способа получить такой путь на уровне приложения.
Вы можете взломать его в файле ASPX и вывести в теге, но я бы подумал о последствиях этого для безопасности.
can
переносите его на клиентскую сторону, но я лично не стал бы :)
- person Lloyd; 21.05.2009
Ответ Камарея можно улучшить для поддержки динамического базового пути:
<head>
<base href="http://<%= Request.Url.Authority + Request.ApplicationPath%>/" />
</head>
Это обеспечит правильный корневой путь независимо от конфигурации развертывания.
Честно говоря, это не отвечает на исходный вопрос, но устраняет большинство потребностей в получении корневого пути из javascript. Просто используйте везде относительные URL без косой черты.
Если вам все еще нужно получить к нему доступ из javascript, добавьте атрибут id и используйте document.getElementFromId()
, как предложил MiffTheFox, но с базовым тегом.
<base href="http://@((Request.Url.Authority + Request.ApplicationPath).TrimEnd('/'))/" />
ApplicationPath иногда заканчивался символом /, а иногда - нет, поэтому я добавил вызов TrimEnd ('/').
- person DanielC; 22.03.2013
Другой вариант, более простой и универсальный, - это взять следующее:
<script src="/assets/js/bootstrap.min.js"><script>
и используйте Page.ResolveClientUrl так:
<script src='<%=ResolveClientUrl("~/assets/js/bootstrap.min.js")%>'></script>
тогда независимо от того, в каком подкаталоге URL-адреса всегда будут отображаться правильно.
Следующая функция вычислит корень текущего запущенного приложения. Я использую его для определения абсолютного местоположения ресурсов при вызове из глубины дерева приложения.
function AppRoot() {
//
// Returns the root of the currently running ASP application.
// in the form: "http://localhost/TRMS40/"
//
// origin: "http://localhost"
// pathname: "/TRMS40/Test/Test%20EMA.aspx"
//
// usage:
// window.open( AppRoot() + "CertPlan_Editor.aspx?ID=" + ID);
//
var z = window.location.pathname.split('/');
return window.location.origin + "/" + z[1] + "/";
}
В PreRender вашей базовой страницы .NET добавьте это:
protected override void
OnPreRender(EventArgs e) {
base.OnPreRender(e);
if (Page.Header != null)
{
//USED TO RESOLVE URL IN JAVASCRIPT
string baseUrl = String.Format("var baseUrl='{0}';\n",
HttpContext.Current.Request.ApplicationPath);
Page.Header.Controls.Add(new LiteralControl(String.Format(Consts.JS_TAG,
baseUrl)));
}
}
Затем в вашей глобальной функции JavaScript добавьте следующее:
function resolveUrl(url) {
if (url.indexOf("~/") == 0) {
url = baseUrl + url.substring(2);
}
return url; }
Теперь вы можете использовать это так:
document.getElementById('someimage').src = resolveUrl('~/images/protest.jpg');
Может быть немного много для некоторых проектов, но отлично работает для полноценных приложений.
Решение для приложений ASP.NET MVC
Это работает при использовании IIS, а также IIS Express в VS.
Поместите этот фрагмент перед загрузкой всех скриптов, чтобы переменная корневого URL-адреса была «одобрена».
к вашим услугам в скриптах:
<script>
var approot = "@Url.Content("~")";
</script>
--> other scripts go here or somewhere later in the page.
Затем используйте его в своем сценарии или сценарии страницы. Пример:
var sound_root_path = approot + "sound/";
var img_root_path = approot + "img/";
переменная Approot будет чем-то либо:
"/ YourWebsiteName /" ‹- IIS
или просто:
"/" ‹- IIS Express
Для страниц ASP.net MVC Razor создайте базовый тег, как показано ниже, в теге <Head>
<base href="http://@[email protected]" />
и во всех относительных URL-адресах javascript убедитесь, что они начинаются без косой черты (/), иначе они будут ссылаться на корень.
Например, создайте все свои URL-адреса, например
"riskInfo": { url: "Content/images/RiskInfo.png", id: "RI" },
or
$http.POST("Account/GetModelList", this, request, this.bindModelList);
Если вы хотите использовать его в HTML, вы можете использовать ~, см.
href = @Url.Content("~/controllername/actionName")
См. Событие щелчка флажка в моем приложении MVC
@Html.CheckBoxFor(m=>Model.IsChecked,
new {@[email protected]("~/controller/action("+ @Model.Id + ", 1)"),
@title="Select To Renew" })