Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Я решил записать аутентификацию пользовательских пользователей самостоятельно (очень простой, но она работает), и я должен сделанный это давным-давно.
Мой исходный вопрос был о UserId, и это не доступно от:
System.Web.HttpContext.Current.User.Identity.Name
Попробуйте это:
MembershipUser CurrentUser = Membership.GetUser(User.Identity.Name);
Response.Write("CurrentUser ID :: " + CurrentUser.ProviderUserKey);
Ваша причина этого для сохранения вызова базы данных каждый раз, Вам нужен UserId? Если так, когда я использую ASP.NET MembershipProvider, я обычно или делаю пользовательского поставщика, который позволяет мне кэшировать тот вызов или служебный метод, который я могу кэшировать.
, Если Вы думаете о помещении его в Профиле, я не вижу больших оснований для того, чтобы сделать так, тем более, что это также все еще потребует вызова базы данных и если Вы не будете использовать пользовательского поставщика профиля там, это имеет добавленную обработку парсинга UserId.
, Если Вы задаетесь вопросом, почему они не реализовали метод GetUserId, это просто, потому что Вам не всегда гарантируют тот, что идентификатором пользователя будет GUID как во включенном поставщике.
РЕДАКТИРОВАНИЕ:
Видят статья ScottGu о поставщиках , который обеспечивает ссылка на загрузку фактического исходного кода для т.е. SqlMembershipProvider.
, Но самая простая вещь сделать действительно GetUserId () метод в Вашем пользовательском объекте, или служебный класс, где Вы получаете UserId от кэша/сессии, если там, иначе поражают базу данных, кэширует ее именем пользователя (или хранилище на сессии) и возвращает ее.
Для чего-то больше, чтобы рассмотреть (но быть очень осторожными из-за ограничений размера cookie): Автор Форм: Членство, Роли и Профиль без Поставщиков и никакой Сессии
У Вас есть две опции здесь:
1) имя пользователя Использования как первичный ключ для Вашей пользовательской таблицы данных т.е.:
select * from [dbo.User] where Username = 'andrew.myhre'
2) Добавляют UserID к профилю.
существуют за и против к каждому методу. Лично я предпочитаю первое, потому что это означает, что я должен не обязательно настроить поставщика профиля out-of-the-box, и я предпочитаю осуществлять уникальные имена пользователей в своих системах так или иначе.
Andrew: я остерегался бы выполнения запроса как то, что Вы показали как по умолчанию, нет никакого индекса, который соответствует этому так, Вы рискуете полным сканированием таблицы. Кроме того, при использовании пользовательской базы данных больше чем для одного приложения Вы не включали идентификатор приложения.
самый близкий индекс является aspnet_Users_Index, который требует ApplicationId и LoweredUserName.
РЕДАКТИРОВАНИЕ:
ой - перечитывает сообщение Andrew, и он не делает выбора * на aspnet_Users таблице, а скорее, пользовательская таблица профиля/пользователя с помощью имени пользователя в качестве первичного ключа.
Вы попытались использовать System.Web.HttpContext.Current.User.Identity.Name
? (Удостоверьтесь, что проверили, что User
и Identity
являются непустыми сначала.)
{
MembershipUser m = Membership.GetUser();
Response.Write("ID: " + m.ProviderUserKey.ToString());
}
даст Вам UserID (uniqueidentifier) для текущего пользователя от aspnet_Membership таблицы - обеспечение тока успешно вошло в систему. Если Вы пробуете к < % = %> или присваивает то значение перед успешной аутентификацией, Вы получите ошибку "Ссылка на объект не набор к экземпляру объекта".