Относительные серверные включения и ASP.NET MVC - PullRequest
1 голос
/ 05 июля 2011

У меня есть веб-приложение ASP.NET MVC, которое должно включать несколько других html-файлов с помощью директивы include, например:

<!--#include virtual=/include/bottom.shtml -->

Моя проблема заключается в том, что мне нужно будет развернуть это приложение на серверахгде путь приложения будет отличаться.Например, в одном месте я мог бы сопоставить приложение, скажем, localhost/myapp/, а в другом я мог бы просто localhost/.

В сценарии localhost/ приведенный выше пример кода работаетпросто хорошо.Но когда мое приложение находится на localhost/myapp, я получаю сообщение об ошибке синтаксического анализатора, которое сообщает мне, что он не может найти файл.

Как я могу настроить директиву, чтобы принять во внимание относительный путь приложения (желательно без использования найти и заменить каждый раз)?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 05 июля 2011

Убейте начальную косую черту - это заставляет рассчитывать путь от корня, а не от вашей страницы.

Но, как сказал @mare, нет причины использовать #include в 2011 году.вы, вероятно, захотите сделать это как частичное рендеринг с использованием @Html.Partial().


Razor. Учитывая обновленные ограничения, в MVC все еще существует гораздо более чистый способ обработки этого, чем использование старого #include.То, что вы хотите сделать, это настроить действие контроллера для чтения файла с диска и возврата содержимого.Затем визуализируйте это действие как обычное действие MVC.

1 голос
/ 05 июля 2011

Прежде всего, я не знаю, почему вы используете такие директивы в ASP.NET MVC, потому что есть и другие лучшие варианты, такие как Partials, Sections и т. Д.

Однако, если вы действительно это делаетеЕсли вы хотите использовать эти директивы, вы можете получить относительные пути, используя помощник

Url

.

ОБНОВЛЕНИЕ

Вы используете Url вспомогательные методынапример, Url.Content (), Url.Action (), Url.ActionLink () для создания ссылок в ASP.NET MVC.

Например, это приведет к отображению относительного пути к файлу bottom.shtml в типичном представлении ASP.NET MVC Razor:

#include virtual=@Url.Content("~/include/bottom.shtml")

Теперь ваши проблемы связаны с использованием include, которыйпо-видимому, внутри комментария HTML.Я могу только объяснить свои наблюдения.Если я сделаю это в моем View

<!-- @Url.Content("~/public/images/foobar.png") -->

и это для механизма просмотра ASP.NET MVC WebForms

<!-- <%=Url.Content("~/public/images/foobar.png")%> -->

, я получу это от браузера в источнике веб-страницы обоимиПредыдущие предложения:

<!-- /public/images/foobar.png -->

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

...