Кодированный вызов метода расширения UrlHelper не выполнен

Я создал простой метод расширения для ASP.NET MVC UrlHelper. Он не принимает аргументов, так как его задача - найти имя файла таблицы стилей в конфигурации и вернуть URL-адрес таблицы стилей. Метод расширения выглядит примерно так:

public static string SiteStylesheet(this UrlHelper urlHelper)
{
    var scriptFilename = UserInterfaceConfiguration.GetSection()
                             .Mvc.SiteStylesheet;
    return urlHelper.Content(string.Format("~/Assets/Scripts/{0}",
                                           scriptFilename));
}

А я использую это так:

<link href="<%= Url.SiteStylesheet() %>" rel="Stylesheet" type="text/css" />

Однако метод не выполняется, и отображается следующее:

href="../Views/Shared/%3C%25=%20Url.SiteStylesheet()%20%25%3E"

Как видите, метод расширения не выполняется, а просто кодируется целиком. Если я изменю подпись метода, чтобы принять параметр:

public static string SiteStylesheet(this UrlHelper urlHelper, string dummy)

затем выполняется метод расширения, и результат будет таким, как ожидалось:

href="/Assets/Stylesheets/FluidCMS.css"

Итак, мой вопрос: это намеренно или это ошибка в механизме просмотра веб-форм ASP.NET MVC?


person user93255    schedule 20.04.2009    source источник


Ответы (3)


Этот вопрос поднимался несколько раз. Корень проблемы в том, что тег ‹head> имеет runat = "server", что заставляет синтаксический анализатор обрабатывать теги как теги сервера.

Самый простой обходной путь - просто удалить runat = "server" из тега заголовка. Вы теряете логику, которая делает URL-адрес ссылки относительным к текущей странице, но, поскольку вы все равно используете своего помощника, вам это не нужно.

person David Ebbo    schedule 22.07.2009

Когда у меня возникла эта проблема, это произошло потому, что мои методы расширения находились в пространстве имен, которое не было указано в web.config.

<add namespace="Your.Extension.Method.Namespace"/>

Он находится в папке configuration \ system.web \ pages \ namespaces.

person ajma    schedule 20.04.2009
comment
Спасибо, но пространство имен, содержащее мой метод расширения, находится в web.config, и я все еще наблюдаю то же поведение. - person user93255; 22.04.2009
comment
Спасибо, попал в эту сам. Также не заметил, что есть 2 web.configs - person Tristan Warner-Smith; 13.05.2009

Думаю, вы нашли ошибку!

Я попробовал и обнаружил, что это происходит только в разделе заголовка главной страницы и только в тегах <link> (теги <script> отображаются нормально).

Проблема, очевидно, в том, что текст внутри атрибута de href неправильно интерпретируется как фрагмент кода.

Это выходит за рамки ASP.NET MVC. Я попробовал использовать его на главной странице на классическом сайте ASP.NET веб-формы, и проблема не исчезла. Похоже, это ошибка в механизме рендеринга веб-форм или что-то в этом роде.

person Gerardo Contijoch    schedule 28.04.2009
comment
Спасибо за подтверждение и подробности. На данный момент обходной путь, хотя и хакерский, достаточно прост и не навязчив. Еще раз спасибо. - person user93255; 01.05.2009