У меня есть несколько пользовательских элементов управления ASP.Net, которые я использую в разных местах моего нового веб-сайта. У этих пользовательских элементов управления были такие ссылки:
<a href = "daily/panchang/"></a>
Если пользовательский элемент управления используется на страницах в различных подкаталогах, относительный путь просто не работает, и я не хочу указывать свое полное имя веб-сайта в пути. Так я сделал это
<a href = "~/daily/panchang/" runat = "server">
и теперь маркер «~» ASP.Net работает правильно для разрешения корневого пути.
Можно ли пометить все мои HTML-теги, в которых мне нужно разрешить корневой путь, с помощью runat = "server", или вы знаете лучший способ HTML?
Спасибо





Однако будьте осторожны, потому что каждый элемент с runat = "server" будет «сериализован» и сохраняться в ViewState каждый раз, когда происходит PostBack, и вы не хотите загромождать его бесполезными данными.
Но опять же ... Я не буду знать, нужно ли мне это, пока у пользователей не возникнет проблема.
Вы можете (и должны) отключить состояние просмотра в отдельных элементах управления, для которых вам не нужно отслеживать состояние просмотра.
Вы должны использовать базовый тег, чтобы определить корень вашего приложения и сделать все ссылки относительными следующим образом:
<head>
<base href = "<%= Request.ApplicationPath %>" />
</head>
...
<a href = "daily/panchang/"></a> <!-- this now points to ~/daily/panchang/ -->
:) Ко всему есть нюанс. Хотя мне нравится это решение
Да, это правда, но в любом хорошем дизайне так должно быть :)
Я тоже считаю, что это хорошее решение. Я просто хотел, чтобы вы проверили, есть ли какие-то общие элементы управления / классы верхнего / нижнего колонтитула, которые «не готовы» для этого решения.
Наверное, это лучшее, что ты можешь сделать :)
yech, базовые теги - это такой запах кода, это вряд ли будет красиво
Что ж, это с треском провалилось, когда я попытался это реализовать. Мой ASP.Net Ajax не будет работать, а полученная мной ошибка совершенно загадочна!
Не скажу, элегантно ли это решение, просто укажу на альтернативу в System.Web:
<a href = "<%= VirtualPathUtility.ToAbsolute("~/daily/panchang/") %>">
Это не выглядит так, как если бы оно было чем-то отличным от того, что я написал, и его труднее читать. Это более эффективно?
На самом деле это совсем другое. Тот, у которого есть сервер runat, создаст HtmlGenericControl и добавит его в иерархию элементов управления. Это создаст LiteralControl с вычисленной строкой.
Я бы не стал беспокоиться об эффективности. Это могло бы быть более эффективным, но, вероятно, не имеет значения. Просто знайте альтернативу и пишите как можно более чистый код.
Я согласен с Кристианом - это намного лучше, чем ваше собственное первоначальное решение - вы также избегаете всей проблемы состояния просмотра.
Я добавил EnableViewState = "False" в свое первоначальное решение и получил то, что нужно. Думаю, почище тоже читать. Что сказать?
Я говорю: дерзай. Я не думаю, что enableviewstate будет иметь какое-либо значение, если вы не установите href при загрузке страницы. ASP.NET обычно не сохраняет состояние просмотра для атрибутов, установленных до «начала отслеживания состояния просмотра», что происходит где-то перед загрузкой.
Смешивание кода с HTML - хорошая идея? Я чувствую, что код предназначен для того, чтобы избавиться от этого.
HTML-код, созданный с помощью runat, выглядит точно так, как вы хотели бы быть на странице.
Что, если я отключу viewstate? Мне не нужны большинство страниц.