我正在使用默认的SQLMembersHippRovider,但是我创建了一个自定义会员类别类(Soemembershiperser),因为我需要一个“ displayName”属性。 DisplayName所做的只是查看用户名和格式不同。

当我尝试将会员使用者施放给Soemembershipuser用户时,我会得到无效的castexception。确切的错误是:“无法施放type'system.web.security.membershiper'type'soe.tracker.soemembershipuser'的对象。”

这是失败的代码:

SoeMembershipUser user = (SoeMembershipUser)Membership.GetUser(username); // invalid cast

我还尝试过这样的铸造:

MembershipUser user = Membershipship.GetUser(username); // ok
...
string displayName = ((SoeMembershipUser)user).DisplayName; // invalid cast

这是Soemembershipuser类:注意:我一开始就离开了构造函数,但是后来我开始遇到问题时添加了它们。添加它们没有什么区别。

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;
        }
    }
}

知道为什么这个演员是无效的吗?我只是忽略了简单的东西吗?

有帮助吗?

解决方案

您正在尝试从基地到派生的班级(也就是从动物到狗的狭窄转换,但并非每只动物都是狗)。创建一个扩展方法,即Tomembershiper,它将进行转换,因为您知道它应该如何进行并且编译器不知道。

其他提示

问题是您正在使用默认的SQLMembersHippRovider。您将必须创建一个 自定义会员Hipprovider.

您可能只需在Getuser方法上扩展SQLMembersHippRovider即可获得。

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);
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top