Является ли добавление runat = "server" в теги HTML для получения относительного пути в ASP.net элегантным решением?

У меня есть несколько пользовательских элементов управления ASP.Net, которые я использую в разных местах моего нового веб-сайта. У этих пользовательских элементов управления были такие ссылки:

<a href = "daily/panchang/"></a>

Если пользовательский элемент управления используется на страницах в различных подкаталогах, относительный путь просто не работает, и я не хочу указывать свое полное имя веб-сайта в пути. Так я сделал это

<a href = "~/daily/panchang/" runat = "server">

и теперь маркер «~» ASP.Net работает правильно для разрешения корневого пути.

Можно ли пометить все мои HTML-теги, в которых мне нужно разрешить корневой путь, с помощью runat = "server", или вы знаете лучший способ HTML?

Спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
2 583
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Однако будьте осторожны, потому что каждый элемент с runat = "server" будет «сериализован» и сохраняться в ViewState каждый раз, когда происходит PostBack, и вы не хотите загромождать его бесполезными данными.

Что, если я отключу viewstate? Мне не нужны большинство страниц.

Cyril Gupta 30.12.2008 15:41

Но опять же ... Я не буду знать, нужно ли мне это, пока у пользователей не возникнет проблема.

Cyril Gupta 30.12.2008 15:42

Вы можете (и должны) отключить состояние просмотра в отдельных элементах управления, для которых вам не нужно отслеживать состояние просмотра.

Per Hornshøj-Schierbeck 30.12.2008 15:50

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

<head>
    <base href = "<%= Request.ApplicationPath %>" />
</head>
...
<a href = "daily/panchang/"></a> <!-- this now points to ~/daily/panchang/ -->

:) Ко всему есть нюанс. Хотя мне нравится это решение

Cyril Gupta 30.12.2008 15:40

Да, это правда, но в любом хорошем дизайне так должно быть :)

Diadistis 30.12.2008 15:40

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

splattne 30.12.2008 15:44

Наверное, это лучшее, что ты можешь сделать :)

Per Hornshøj-Schierbeck 30.12.2008 15:52

yech, базовые теги - это такой запах кода, это вряд ли будет красиво

annakata 30.12.2008 15:59

Что ж, это с треском провалилось, когда я попытался это реализовать. Мой ASP.Net Ajax не будет работать, а полученная мной ошибка совершенно загадочна!

Cyril Gupta 30.12.2008 18:28
Ответ принят как подходящий

Не скажу, элегантно ли это решение, просто укажу на альтернативу в System.Web:

<a href = "<%= VirtualPathUtility.ToAbsolute("~/daily/panchang/") %>">

Это не выглядит так, как если бы оно было чем-то отличным от того, что я написал, и его труднее читать. Это более эффективно?

Cyril Gupta 30.12.2008 15:37

На самом деле это совсем другое. Тот, у которого есть сервер runat, создаст HtmlGenericControl и добавит его в иерархию элементов управления. Это создаст LiteralControl с вычисленной строкой.

Cristian Libardo 30.12.2008 15:46

Я бы не стал беспокоиться об эффективности. Это могло бы быть более эффективным, но, вероятно, не имеет значения. Просто знайте альтернативу и пишите как можно более чистый код.

Cristian Libardo 30.12.2008 15:50

Я согласен с Кристианом - это намного лучше, чем ваше собственное первоначальное решение - вы также избегаете всей проблемы состояния просмотра.

Per Hornshøj-Schierbeck 30.12.2008 15:51

Я добавил EnableViewState = "False" в свое первоначальное решение и получил то, что нужно. Думаю, почище тоже читать. Что сказать?

Cyril Gupta 31.12.2008 11:02

Я говорю: дерзай. Я не думаю, что enableviewstate будет иметь какое-либо значение, если вы не установите href при загрузке страницы. ASP.NET обычно не сохраняет состояние просмотра для атрибутов, установленных до «начала отслеживания состояния просмотра», что происходит где-то перед загрузкой.

Cristian Libardo 02.01.2009 01:02

Смешивание кода с HTML - хорошая идея? Я чувствую, что код предназначен для того, чтобы избавиться от этого.

jjnguy 22.05.2009 18:17

HTML-код, созданный с помощью runat, выглядит точно так, как вы хотели бы быть на странице.

jjnguy 22.05.2009 18:18

Другие вопросы по теме