1

Я использую asp.net LoginView для отображения разных данных для аутентифицированных и анонимных пользователей.System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта

<asp:LoginView ID="LoginView1" Runat="server"> 
    <LoggedInTemplate> 
     <asp:Label ID="Foo" runat="server" /> 
    </LoggedInTemplate> 
    <AnonymousTemplate> 
     <asp:Label ID="Bar" runat="server" /> 
    </AnonymousTemplate> 
</asp:LoginView> 

Я тогда доступ к этим ярлыки в моей C# файл, как это:

Label Foo = (Label)LoginView1.FindControl("Foo"); 
Foo.Text = "whatever"; 

Ошибка я получаю читает:

Описание: Необработанное исключение при выполнении текущего веб запрос. Просмотрите трассировку стека для получения дополнительной информации об ошибке и ее возникновении в коде.

Сведения об исключении: System.NullReferenceException: Ссылка на объект не установлена ​​в экземпляр объекта.

+0

Вы можете добавить свой стек детали трассировки, а? – vendettamit

+0

Похоже, что он не нашел ваш ярлык, попробуйте проверить, что Foo не имеет значения null, прежде чем пытаться его использовать. –

+2

Добро пожаловать в переполнение стека! Почти все случаи «NullReferenceException» одинаковы. См. «[Что такое исключение NullReferenceException в .NET?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net)» для некоторых советов. –

ответ

1

Ну, вероятно, во время выполнения пользователь не вошел в систему - поэтому нет контроля с идентификатором Foo, поэтому FindControl возвращает null. Вы должны либо определить, зарегистрирован ли пользователь или нет отдельно, либо запросить правильный элемент управления, либо проверить, Foo - null, прежде чем использовать его. (Вы можете рассмотреть вопрос о переименовании локальной переменной foo более созвучны C# конвенций, тоже.)

+0

как вы не C# MVP на всю жизнь? Действительно, Microsoft должна предоставить награду за достижения в жизни на C# для вас. :-) –

0

Попробуйте это:

Label Foo = (Label)LoginView1.FindControl("Foo"); 
if(Foo != null) 
{ 
    Foo.Text = "whatever"; 
} 

Теперь вы не получите сообщение об ошибке, но если Foo является null, то текст вашего ярлыка не будет обновляться. Вам нужно определить, почему он не может найти Label с именем «Foo».

+0

Не проверяется на наличие null здесь странно? Как не будет управления с именем Foo, если вы его создали? –

+0

@ AndersLindén - потому что есть два разных шаблона; 'LoggedInTemplate' и' AnonymousTemplate', так что существует вероятность того, что метки 'Foo' не существует, потому что если' AnonymousTemplate' активен, то метка 'Bar' будет существовать, а метка' Foo' не будет. –

0

Вы должны проверить нулям:

object labelObj = LoginView1.FindControl("Foo") 
if(labelObj != null) 
{ 
    Label Foo = (Label)labelObj; 
    if(Foo.Text!=null) 
     Foo.Text="whatever"; 
} 
+0

Не очень эффективно. Результат FindControl() должен быть кэширован, поэтому вам не нужно вызывать его дважды. –

 Смежные вопросы

  • Нет связанных вопросов^_^