Подтвердить что ты не робот

Asp.net пользовательский контроль, получение htmlAnchor разрешить href= "#"

Как вы получаете серверный контроль HTMLAnchor для href= "#". Он продолжает разрешать "#" на пути управления.

<a href="#" runat="server" />
resolves to: <a href="../ControlPath/#">

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

EDIT: синтаксис.

Удаление сервера runat не является вариантом. Он управлялся в бэкэнде, это было просто упрощение.

4b9b3361

Ответ 1

У меня была та же проблема, вот как я мог ее решить:

Исходный код

Пользовательский контроль:

<a id="foo" runat="server">...</a>

Код позади:

foo.Attributes.Add("href", "#");

Вывод:

<a id="..." href="../Shared/Controls/#">...</a>

Обновленный код

Пользовательский контроль:

<asp:HyperLink id="foo" runat="server">...</asp:HyperLink>

Код позади:

foo.Attributes.Add("href", "#");

Вывод:

<a id="..." href="#">...</a>

Ответ 2

У меня была аналогичная проблема при рендеринге страницы с помощью PageParser.GetCompiledPageInstance() или когда URL был переписан. По какой-то причине HtmlAnchor всегда исправлялся неправильно (аналогично тому, что у вас было выше).

Закончено только с помощью HtmlGenericControl, так как вы все-таки манипулируете сервером, это может быть для вас.

HtmlGenericControl anchor = new HtmlGenericControl("a");
anchor.Attributes.Add("href", "#");

Ответ 3

Решение Брендана Ковица будет работать, однако я не смог его реализовать из-за того, как этот элемент управления должен работать. В итоге мне пришлось взломать его в соответствии с следующим кодом в коде:

lnk.Attributes.Add("href",Page.Request.Url.ToString() + "#");

Где lnk - HtmlAnchor.

Причина этой проблемы в первую очередь заключается в том, что элемент управления не находится в том же каталоге, что и страница, и .Net продолжает "разумно" исправлять вашу проблему за вас. Вышеупомянутое будет работать, хотя если у кого-то есть лучшее решение, я все уши.

Ответ 4

Первоначально у меня было это как комментарий, но по запросу я добавляю его в качестве ответа, поскольку никто не объяснил, почему происходит первоначальное поведение или как его предотвратить.

Переписывание URL-адресов вызвано методом ResolveURL в классе Control. Я посмотрел на него в Reflector и обнаружил, что он попытается переписать все, что, по его мнению, является относительным URL, если AppRelativeTemplateSourceDirectory не пуст.

Простым обходным решением является установка этой переменной на объект страницы на пустую строку на каком-либо глобальном уровне (или, по крайней мере, до Render), хотя это может быть проблемой, если какой-либо другой бит вашей структуры управления требует, чтобы она была пустой.

Я предполагаю, что истинным решением было бы заставить Microsoft сделать UrlPath.IsRelativeUrl() умнее.

Ответ 5

Я столкнулся с тем же. Если вы установите это на загрузку страницы, он будет работать:

AppRelativeTemplateSourceDirectory = "";

Ответ 6

Попробуйте удалить атрибут "runat" и обернуть то, что вы хотите связать;

<a href="#" >Your Link Text/Image Here</a>

Ответ 7

Это должно работать.

<a href="javascript:void(0)">text</a>

Забастовкa >

Это должно работать.

<a href="~/#">text</a>

Ответ 8

EDIT: включает вложенные пути

Мой тестовый проект отображает для меня правильную ссылку:

 http://localhost:2279/WebSite1/Default.aspx#

ASPX:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register src="control/WebUserControl2.ascx" tagname="WebUserControl2" tagprefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">    
          <uc1:WebUserControl2 ID="WebUserControl21" runat="server" />
    </form>
</body>
</html>

Управление:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl2.ascx.cs" Inherits="WebUserControl2" %>
<a id="A1" href="<%# URLHelper("~/#") %>" runat="server" >here</a>

Код управления позади:

protected string URLHelper(string s)
{
    return Control.ResolveUrl(s);
}

Ответ 9

Моя тоже отлично работает... У меня есть пользовательский контроль AnchorTag.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="AnchorTag.ascx.cs" Inherits="JavascriptScroll.AnchorTag" %>
<a id="A1" href="#" runat="server" >Anchor Tag</a>

И я включил его как:

<%@ Register src="AnchorTag.ascx" tagname="AnchorTag" tagprefix="uc1" %>

. , .

<uc1:AnchorTag ID="AnchorTag1" runat="server" />

. .

И это выглядит так, как ожидалось:

 <a href="#" id="AnchorTag1_A1">Anchor Tag</a>

Пожалуйста, поправьте меня, если я делаю то, чего не ожидается...

Ответ 10

Как насчет этого?

HtmlAnchor errorLink = new HtmlAnchor();
errorLink.InnerText = this.Message;
errorLink.HRef = errorLink.ResolveClientUrl("#" + this.FormControlId);
errorLink.Attributes["rel"] = "form_help";

Работает для меня, но я использую серверный контроль в библиотеке классов, а не в User Control. Я думаю, что он должен работать и для User Control.