SparkViewEngine: Использование Url.Content в глобальной переменной в Application.Spark - PullRequest
2 голосов
/ 06 января 2011

Я использую ASP.NET MVC 2 с SparkViewEngine 1.1 и получаю сообщение об ошибке Требуется ссылка на объект для нестатического поля, метода или свойства 'Spark.Web.Mvc.SparkView .Url.get ', когда я использую следующий код в файле представления Application.spark

<global baseImagePath='Url.Content(Context,"~/Content/_images")' type="string" />

Что я пытаюсь сделать, так это определить путь к базовому изображению как глобальную переменную, на которую можно ссылаться в шаблонах страниц.

Например, в Home / Index.spark, который использует мастер Application.spark, у меня будет следующий фрагмент кода в представлении

<a href="..."><img src="${baseImagePath}" alt="..." /></a>

В качестве обходного пути, я могу установить жестко запрограммированное значение, когда я устанавливаю baseImagePath, выполнив <global baseImagePath='"~/Content/_images"' type="string" />, но я также хочу иметь возможность разрешать «~» перед рукой.

Есть предложения?

Спасибо!

Редактировать Я добавляю свое решение здесь согласно предложениям Роба

В Shared / _global.spark я добавил <use namespace="System.Web" />, чтобы у меня был доступ к пространству имен System.Web.

В Shared / Application.spark , я добавил

<global baseImagePath='VirtualPathUtility.ToAbsolute("~/Content/_images")' type="string" />

1 Ответ

3 голосов
/ 06 января 2011

Проблема в том, что Url.Content(... обращается к классу UrlHelper в System.Web.Mvc из экземпляра SparkView.Проблема в том, что когда Application.spark анализируется для глобальных переменных, у вас еще нет экземпляра представления, поскольку глобальные переменные определены до того, как будет создан экземпляр сгенерированного класса представления.Поэтому доступ к переменной экземпляра, такой как Url, из представления невозможен.

Однако, судя по всему, вы просто пытаетесь получить абсолютный путь от относительного.Для этого вы могли бы просто использовать статический VirtualPathUtility класс из System.Web.

Существует ряд методов, таких как ToAbsolute(...), которые облегчают жизнь.Кроме того, вы можете получить его из метода HttpContext.Current.Server.MapPath(...), если у вас есть текущий контекст.

Надеюсь, что это поможет,
Всего наилучшего,
Роб Г

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...