Обслуживание локального файла на веб-сайте ASP.NET MVC

Допустим, у меня есть файл, расположенный по адресу C:\foo\bar.js, и я хочу включить этот файл в веб-сайт ASP.NET MVC, который, очевидно, размещен на том же компьютере.

Это не работает:

<script src="C:\foo\bar.js"></script>

И это тоже:

<script src="file:///C:/foo/bar.js"></script>

Приведенные выше две строки также не имеют смысла, поскольку они будут смотреть на папку клиента, а не на папку сервера.

Итак, как я могу передать этот файл из контроллера ASP.NET MVC (в контроллере у меня есть строковое значение пути к локальному физическому файлу, т.е. C:\foo\bar.js) в представление? Может быть, что-то с HttpHandler?


person Andreas Grech    schedule 17.11.2010    source источник
comment
К вашему сведению: при этом вы можете столкнуться с проблемами безопасности браузера. Но тогда, если вы обслуживаете веб-страницу, которая зависит от файлов, находящихся в определенном месте на диске пользователя...   -  person Dan Atkinson    schedule 18.11.2010
comment
Нет, файлов не будет на диске пользователей; файлы, которые я буду обслуживать, будут находиться на машине, на которой размещается сайт, но не в виртуальном каталоге, поэтому они не будут доступны через веб-сервер.   -  person Andreas Grech    schedule 18.11.2010


Ответы (2)


Примечание. Это решение предполагает, что файл js не является частью веб-приложения. Если это так, вам, вероятно, следует использовать вместо этого Url.Content или ResolveClientUrl.

Вы должны иметь возможность ссылаться на URL-адрес действия контроллера в теге script:

<script src="/ControllerName/GetJavascriptFile"></script>

... и выполнить действие типа::

public ActionResult GetJavascriptFile() {
   string mp = @"C:\foo\bar.js";
   return File(mp, "text/javascript");
}

http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.file%28VS.90%29.aspx

person markt    schedule 17.11.2010
comment
Почему обход через контроллер? - person Adrian Grigore; 17.11.2010
comment
Возможно, я неправильно понял... но похоже, что файл сценария не является частью веб-приложения. В противном случае включение сценария должно быть тривиальным. - person markt; 17.11.2010
comment
У меня тоже сложилось такое впечатление, поэтому +1. Казалось, что ОП спрашивал, как включить файл, который на самом деле не отображается веб-сервером. - person David; 17.11.2010
comment
Да, и Маркт, и Давид правы; Файлы, которые я хочу обслуживать, не являются частью веб-приложения и, следовательно, не доступны через веб-сервер. - person Andreas Grech; 17.11.2010
comment
@Andreas: Почему вы хотите включить файл JavaScript, который не является частью веб-приложения? - person Tom Kidd; 18.11.2010
comment
@Schnapple: потому что эти файлы будут добавлены через другую внешнюю службу, и она полностью не связана с веб-приложением. Таким образом, файлы будут находиться в репозитории, и веб-приложение должно будет получить к нему доступ и обслуживать их на странице. - person Andreas Grech; 18.11.2010
comment
@markt: Спасибо за ваш ответ; используя класс Controller.File, мне удалось сделать то, что я хотел. - person Andreas Grech; 18.11.2010

Как я это делал, предположим, что у вас есть папка с именем Scripts вне корня (так, параллельно с Controllers, Models и т. д.), и вы храните в ней файлы JavaScript, вы можете использовать это:

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

(разделить на несколько строк, чтобы было легче читать)

Предполагается, что ваш вопрос заключается в том, как указать ссылку на расположение .js включаемых файлов, но аналогичный трюк можно применить к любым файлам содержимого (например, установщикам плагинов или чему-то еще)

person Tom Kidd    schedule 17.11.2010
comment
Проблема в том, что файлы, которые я хочу обслуживать, не являются частью виртуального каталога, содержащего сайт. - person Andreas Grech; 17.11.2010