Не может бросить участие в пользовательском классе (ASP.NET)
-
08-10-2019 - |
Вопрос
Я использую SQLMembershipDROVIDER по умолчанию, но я создал Custom Custom NuralhiMetiver Class (SOMEMBERSIVERSER), потому что мне нужно было свойство «DisplayName». Все отображает имя пользователя, это посмотрите на имя пользователя и формат его по-разному.
Когда я пытаюсь отбрасывать членство в пользователю SummershistUSER, я получаю InvalidCastException. Точная ошибка: «Невозможно отличить объект типа» System.Web.security. Мбитилище к типу «SOE.Tracker.soembersister».
Вот код, который не удается:
SoeMembershipUser user = (SoeMembershipUser)Membership.GetUser(username); // invalid cast
Я также попробовал кастинг позже так:
MembershipUser user = Membershipship.GetUser(username); // ok
...
string displayName = ((SoeMembershipUser)user).DisplayName; // invalid cast
Вот класс SOMEMBERSIVERSER: Примечание: сначала я сначала ушел с конструкторов, но добавил их позже, когда у меня начал проблемы. Добавление их не было никакой разницы.
public class SoeMembershipUser : MembershipUser
{
public SoeMembershipUser()
: base()
{
}
public SoeMembershipUser(string providerName, string name,
Object providerUserKey, string email, string passwordQuestion,
string comment, bool isApproved, bool isLockedOut,
DateTime creationDate, DateTime lastLoginDate,
DateTime lastActivityDate, DateTime lastPasswordChangedDate,
DateTime lastLockoutDate)
: base(providerName, name, providerUserKey, email,
passwordQuestion, comment, isApproved, isLockedOut,
creationDate, lastLoginDate, lastActivityDate,
lastPasswordChangedDate, lastLockoutDate)
{
}
public virtual string DisplayName
{
get
{
if (UserName.Contains("@"))
return UserName.Substring(0, UserName.IndexOf("@"));
return UserName;
}
}
}
Любая идея, почему этот актерс недействителен? Я просто с видом на что-то простое?
Решение
Вы пытаетесь ускорить с базы на полученный класс (ака сужаемая конверсия, как от животного к собаке - но не каждое животное - это собака). Создайте метод расширения, TomembershipUser, который сделает преобразование, поскольку вы знаете, как он должен продолжить, и компилятор не.
Другие советы
Проблема в том, что вы используете SQLMembershipDROVIDER по умолчанию. Вам придется создать Пользовательские членыПровидер.
Вы, вероятно, можете покончить с просто расширением SQLMembershipProvider в методах GetUSER.
public class SoeMembershipProvider : SqlMembershipProvider
{
public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
{
var sqlMembershipUser = base.GetUser(providerUserKey, userIsOnline);
return new SoeMembershipUser(sqlMembershipUser);
}
public override MembershipUser GetUser(string username, bool userIsOnline)
{
var sqlMembershipUser = base.GetUser(username, userIsOnline);
return new SoeMembershipUser(sqlMembershipUser);
}
}