Как указать путь относительно текущего файла мастер-страницы

Я новичок в asp.net, но мастер-страницы, похоже, делают то, что мне нужно - позволяют мне настраивать разные шаблоны / презентации / стили во время выполнения, поэтому мое приложение может выглядеть по-другому, выбрав другую мастер-страницу. Каждая мастер-страница находится в своей собственной папке с набором изображений, адаптированных для этого «шаблона» - затем я хочу на страницах содержимого ссылаться на различные изображения, находящиеся в папке выбранной в данный момент мастер-страницы, например, кнопки навигации в DataPager:

<asp:DataPager ID="DataPager1" runat="server" PagedControlID="ListView1" 
    PageSize="25">
<Fields>
    <asp:NextPreviousPagerField ButtonType="Image" ShowFirstPageButton="True" 
        ShowNextPageButton="False" 
        FirstPageImageUrl="<<Current Master Root>>/img/action-first.png" 
        PreviousPageImageUrl="<<Current Master Root>>/img/action-prev.png" />
    <asp:NumericPagerField ButtonCount="10" NextPageText="&gt;&gt;" 
        PreviousPageText="&lt;&lt;" />
    <asp:NextPreviousPagerField ButtonType="Image" ShowLastPageButton="True" 
        ShowPreviousPageButton="False" 
        LastPageImageUrl="<<Current Master Root>>/img/action-last.png"
        NextPageImageUrl="<<Current Master Root>>/img/action-next.png" />
</Fields>
</asp:DataPager>
TEST: "<%= System.IO.Path.GetDirectoryName(MasterPageFile) %>" 
(this does not work if we try to use it inside the DataPager?)

Есть ли правильный способ сделать это, например, использовать символ tilda ~ для доступа к корневой папке приложения? Установка этого в коде также оказывается утомительной, особенно для таких вещей, как DataPager, где свойства вложены в динамические списки субэлементов управления (например, я не знаю, как установить свойство DataPager1.Fields [0] .NextPreviousPagerField.FirstPageImageUrl в код).

Я обнаружил, что попытка сделать это с помощью тем требует большего количества кода, чем я начал, потому что мне нужно включить все определение элемента управления в файл скина, а не только свойства URL-адреса изображения, а затем мне нужно дублировать этот код в каждой отдельной теме / кожа. Если мне понадобится DataPager с другой конфигурацией кнопок и / или числовых полей, мне также придется продублировать эти варианты в каждом файле скина. Если я внесу изменение позже, мне придется не забыть внести это изменение и во все скины, что серьезно противоречит цели отделения кода от скина.

Мое приложение запускает несколько проектов, и каждый проект может выбирать свой собственный шаблон. Для всего приложения я хочу сказать: если текущий проект использует TemplateX, тогда используйте изображения из папки / TemplateX / img /, если TemplateY выбран, тогда используйте изображения из / TemplateY / img /. Как вы знаете, нельзя всегда полагаться на CSS, чтобы определить, какое изображение и где использовать, поэтому мы должны иметь возможность помещать ссылку на изображение непосредственно в вывод HTML.

В собственной веб-системе ISAPI DLL, которую я разработал, я просто использую строку подстановки вроде «[# HTML.Template] /img/prev.png», чтобы прикрепить папку шаблона перед URL-адресом изображения. Есть ли способ подключить пользовательский препроцессор .aspx, чтобы вручную заменить все вхождения, как в приведенном выше примере, «‹< Current Master Root >>» на текущую выбранную папку?


person Etherman    schedule 02.12.2011    source источник
comment
Вместо этого вы можете посмотреть темы - см. msdn.microsoft.com/en- us / library / ykzx33wh.aspx Вы можете легко переключать темы во время выполнения.   -  person dash    schedule 02.12.2011
comment
Использование тем вроде работает, но это не лучшее решение. Я могу поместить подпапку img в папку Theme, но я должен включить все в тег ‹fields›, а не только свойства URL-адреса изображения. Это означает, что я должен продублировать весь этот код для каждой темы (и для каждого типа и вариации управления), что противоречит цели.   -  person Etherman    schedule 05.12.2011
comment
Я думаю, у вас есть довольно приличное решение, если честно. Я бы, вероятно, записал свои URL-адреса изображений как /{MASTER}/img/img.png и использовал бы библиотеку UrlRewriting для захвата путей к этому URL-адресу и замены токена на текущую главную страницу. Это эквивалентно тому, что у вас есть, хотя вам не нужна специальная DLL-библиотека ISAPI - вы можете просто сопоставить обработчик со своим .Net-кодом (msdn.microsoft.com/en-us/library/ms972953.aspx). Альтернативой является создание собственных настраиваемых элементов управления из элементов фреймворка и изменение их методов рендеринга, чтобы они знали о главной странице - решение, которое у вас есть, намного проще.   -  person dash    schedule 05.12.2011
comment
DLL ISAPI - это полностью автономная веб-система, написанная с использованием Delphi. Я пытаюсь повторно реализовать это решение с помощью Visual Studio / ASP.NET. Это может быть источником некоторых ментальных блоков, поскольку у меня есть предубеждения, основанные на том, как я делал что-то в этой системе, что для меня кажется очевидным, но в asp.net кажется очень запутанным. Я посмотрю на UrlRewriting, но я немного скептически отношусь к этому - например, как обработчик URL-адреса знает, какая главная страница использовалась для создания URL-адреса, или нам тогда нужно будет добавить главную страницу к URL-адресу (... что затем приводит к тому же вопросу, что и исходный)   -  person Etherman    schedule 05.12.2011
comment
Вы должны увидеть текущий HTTPContext в обработчике. В зависимости от того, где вы находитесь в жизненном цикле запроса, вы можете получить дескриптор запрашиваемой страницы, что означает, что вы должны иметь возможность работать с текущей главной страницей. Вы, безусловно, можете связаться с пользователем, поэтому вы также можете проверить, какое свойство текущей главной страницы пользователя тоже, если вы хотите сохранить его как пользовательскую настройку для текущего пользователя (через сеанс, запрос к базе данных и т. Д.) .   -  person dash    schedule 05.12.2011


Ответы (1)


попробуйте использовать что-то вроде этого

var path = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpContext.Current.Request.ApplicationPath;
person huMpty duMpty    schedule 02.12.2011
comment
Ваш код не включает текущую мастер-страницу. Для этого я могу использовать System.IO.Path.GetDirectoryName (MasterPageFile), но, как уже говорилось, похоже, нет удобного способа декларативно использовать это в DataPager. - person Etherman; 05.12.2011