#asp.net #vb.net #login
#asp.net #vb.net #аутентификация
Вопрос:
Я работаю над ASP.NET VB.NET Веб-приложение. Я унаследовал кучу форм из другого приложения, которое у нас есть. Я сталкиваюсь с очень странной проблемой при работе на странице входа.
Это сокращенная версия моего кода:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="Server">
<table>
<tr>
<td>
<span id="Span1" runat="Server" style="Color: Red"></span>
</td>
</tr>
<tr>
<td>
<asp:Login ID="Login1" runat="server">
<LayoutTemplate>
<table>
<tr>
<td>
<span id="Span1" runat="Server" style="Color: Red"></span>
</td>
</tr>
</table>
</LayoutTemplate>
</asp:login>
</td>
</tr>
</table>
</asp:Content>
У меня есть <span id="span1">
, который находится внутри моей веб-формы, в Content
части страницы. Я могу легко получить доступ к этому в моем CodeBehind и делать с ним все, что захочу. Однако, если я перемещу этот интервал и помещу его в <asp:login>
часть страницы, он, похоже, не распознает его, он не позволит мне получить к нему доступ в коде позади, он выдает мне волнистую синюю линию и говорит
span1 не объявлен. Это может быть недоступно из-за уровня защиты
Этот бит находится в верхней части веб-формы в конструкторе
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Login.aspx.vb" Inherits="_Default" MasterPageFile="~/Site.master" %>
Этот бит взят со страницы Login.aspx.vb
Partial Class _Default
Просто чтобы сказать это снова, id="span1"
отлично работает там, где это показано в приведенном выше коде, но когда я перемещаю его внутрь, я больше не могу ссылаться на него. Поскольку я говорю об этой проблеме, если на то пошло, я не могу добавить какие-либо новые элементы управления внутри, потому что я не могу ссылаться на какие-либо другие элементы управления в vb.net . (эта форма была в значительной степени скопирована из другого проекта, все работает правильно, я просто не уверен, почему у меня возникла эта странная проблема)
Я заметил, что у многих людей похожие проблемы, но в моем случае я работаю с <asp:login>
, и я действительно не уверен, как это влияет на мои элементы управления.
Редактировать: <span id="Span1" runat="Server" style="Color: Red"></span>
Комментарии:
1. Я думаю, что проблема связана с контейнером именования. Когда вы перемещаете его внутри шаблона, он становится дочерним для
Login1
элемента управления и будет удален из файла конструктора. Может быть, вы могли бы попробоватьLogin1.FindControl("span1")
вместо этого в своем коде2. @freefaller Я могу, потому что у меня есть runat =»server» пожалуйста, смотрите edit, именно так это выглядит. Я использую его, чтобы установить для него текстовое значение .innerHTML
3. тогда, пожалуйста, не удивляйтесь, если мы обнаружим проблемы, если вы не покажете нам, что у вас на самом деле есть. Пожалуйста, перечитайте мой отредактированный комментарий, который был основной причиной, по которой я его написал
4. @freefaller Прошу прощения. Это также не работает. Intellisense распознает это, и я также получаю волнистую строку, когда делаю что-то вроде этого: Login1. FindControl(«span1″). innerHTML=»привет». Asp: login имеет другие элементы управления, такие как текстовые поля и кнопки, и нет необходимости ссылаться на него, предваряя его Login1. FindControl. На него просто ссылается только имя элемента управления
5.
.FindControl
возвращает объект, вам нужно присвоить ему правильный тип, прежде чем вы сможете вызывать для него какие-либо свойства / методы. Что-то вродеCType(Logon1.FindControl("span1"), HtmlGenericControl).InnerHtml = "hello"
Ответ №1:
Вам необходимо использовать FindControl для элемента управления Login1
HtmlGenericControl hgc = Login1.FindControl("Span1") as HtmlGenericControl;
hgc.InnerText = "Span Found";
VB
Dim hgc As HtmlGenericControl = CType(Login1.FindControl("Span1"),HtmlGenericControl)
hgc.InnerText = "Span Found"
Ответ №2:
Согласно моим комментариям и по запросу OP…
Вы столкнулись с проблемой с контейнером именования.
Когда <span runat="server">
находится за пределами <asp:Login><LayoutTemplate>
, он существует как объект на странице, на который вы можете ссылаться напрямую.
Как только он перемещается внутри этого <LayoutTemplate>
, он становится дочерним элементом <asp:Login>
элемента управления.
Итак, чтобы получить доступ к элементу управления, вы можете использовать следующее…
CType(Logon1.FindControl("span1"), HtmlGenericControl).InnerHtml = "hello"
FindControl
Вернет объект, но он должен быть «упакован» в правильный тип, прежде чем вы сможете получить доступ к InnerHtml
свойству
Ответ №3:
чтобы получить доступ к элементу управления на стороне сервера, вы должны включить атрибут «runat=’server'» в тег. Вот что говорит.СЕТЬ, с которой любой данный элемент управления должен работать как на стороне сервера, так и на интерфейсе.
Обратите внимание, что это изменит идентификатор, созданный в отображаемом HTML
<span id="span1" runat="server"></span>
Комментарии:
1. Извините, что пропустил этот лакомый кусочек, но у меня есть runat =»server», пожалуйста, смотрите edit. Я не полностью копировал / вставлял код, я печатаю его сам.