c# - 从 MembershipUser 继承 - Asp.net/C#

标签 c# readonly inheritance membershipuser

我有一个继承自 MembershipUser 的客户类。

当我加载一个 Customer 对象时,我希望能够轻松地设置基类中的所有值。

我尝试声明隐藏只读 MembershipUser 属性(例如 ProviderUserKey)的 Customer 属性,然后设置这些属性,但是当我需要设置它们时,基类属性为 null。

这是我的类 Customer.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Web;
using System.Web.Security;
using _FusioLibrary.Utilities;

namespace _CutMyCostsLibrary.BusinessObjects
{
   public class Customer : MembershipUser
   {
    #region Properties

    private Boolean active;
    public Boolean Active
    {
        get { return active; }
        set { active = value; }
    }

    private String address1;
    public String Address1
    {
        get { return address1; }
        set { address1 = value; }
    }

    private String address2;
    public String Address2
    {
        get { return address2; }
        set { address2 = value; }
    }

    private String companyName;
    public String CompanyName
    {
        get { return companyName; }
        set { companyName = value; }
    }

    private String county;
    public String County
    {
        get { return county; }
        set { county = value; }
    }

    private DateTime createDate;
    public DateTime CreateDate
    {
        get { return createDate; }
        set { createDate = value; }
    }

    private Int32 customerId;
    public Int32 CustomerId
    {
        get { return customerId; }
        set { customerId = value; }
    }

    private Boolean deleted;
    public Boolean Deleted
    {
        get { return deleted; }
        set { deleted = value; }
    }


    private String firstName;
    public String FirstName
    {
        get { return firstName; }
        set { firstName = value; }
    }

    private String lastName;
    public String LastName
    {
        get { return lastName; }
        set { lastName = value; }
    }

    private String mobile;
    public String Mobile
    {
        get { return mobile; }
        set { mobile = value; }
    }

    private DateTime modifyDate;
    public DateTime ModifyDate
    {
        get { return modifyDate; }
        set { modifyDate = value; }
    }

    private String phone;
    public String Phone
    {
        get { return phone; }
        set { phone = value; }
    }

    private DateTime reminderEmailSentDate;
    public DateTime ReminderEmailSentDate
    {
        get { return reminderEmailSentDate; }
        set { reminderEmailSentDate = value; }
    }

    private String town;
    public String Town
    {
        get { return town; }
        set { town = value; }
    }

    private String userIdAspNet;
    public String UserIdAspNet
    {
        get { return userIdAspNet; }
        set { userIdAspNet = value; }
    }


    #endregion

    #region MembershipUser Properties Hiding 

    read only properties need to be writeable

    private DateTime creationDate;
    public DateTime CreationDate
    {
        get { return creationDate; }
        set { creationDate = value; }
    }

    private bool isLockedOut;
    public bool IsLockedOut
    {
        get { return isLockedOut; }
        set { isLockedOut = value; }
    }

    private bool isOnline;
    public bool IsOnline
    {
        get { return isOnline; }
        set { isOnline = value; }
    }

    private DateTime lastLockoutDate;
    public DateTime LastLockoutDate
    {
        get { return lastLockoutDate; }
        set { lastLockoutDate = value; }
    }

    private DateTime lastPasswordChangedDate;
    public DateTime LastPasswordChangedDate
    {
        get { return lastPasswordChangedDate; }
        set { lastPasswordChangedDate = value; }
    }

    private string passwordQuestion;
    public string PasswordQuestion
    {
        get { return passwordQuestion; }
        set { passwordQuestion = value; }
    }
    private string providerName;
    public string ProviderName
    {
        get { return providerName; }
        set { providerName = value; }
    }

    private object providerUserKey;
    public object ProviderUserKey
    {
        get { return providerUserKey; }
        set { providerUserKey = value; }
    }

    private string userName;
    public string UserName
    {
        get { return userName; }
        set { userName = value; }
    }


    #endregion


    #region Load

    public static Customer Load(IDataReader iDataReader) 
    {
        Customer oCustomer = new Customer();


        //populate the customer properties
        oCustomer.Active = DataReaderUtility.GetBool(iDataReader["Active"]);
        oCustomer.Address1 = DataReaderUtility.GetString(iDataReader["Address1"]);
        oCustomer.Address2 = DataReaderUtility.GetString(iDataReader["Address2"]);
        oCustomer.CompanyName = DataReaderUtility.GetString(iDataReader["CompanyName"]);
        oCustomer.County = DataReaderUtility.GetString(iDataReader["County"]);
        oCustomer.CreateDate = DataReaderUtility.GetDateTime(iDataReader["CreateDate"]);
        oCustomer.CustomerId = DataReaderUtility.GetInt(iDataReader["CustomerId"]);
        oCustomer.Deleted = DataReaderUtility.GetBool(iDataReader["Deleted"]);
        oCustomer.FirstName = DataReaderUtility.GetString(iDataReader["FirstName"]);
        oCustomer.LastName = DataReaderUtility.GetString(iDataReader["LastName"]);
        oCustomer.Mobile = DataReaderUtility.GetString(iDataReader["Mobile"]);
        oCustomer.ModifyDate = DataReaderUtility.GetDateTime(iDataReader["ModifyDate"]);
        oCustomer.Phone = DataReaderUtility.GetString(iDataReader["Phone"]);
        oCustomer.ReminderEmailSentDate = DataReaderUtility.GetDateTime(iDataReader["ReminderEmailSentDate"]);
        oCustomer.Town = DataReaderUtility.GetString(iDataReader["Town"]);
        oCustomer.UserIdAspNet = DataReaderUtility.GetString(iDataReader["UserIdAspNet"]);



        //populate the MembershipUser properties
        if(!string.IsNullOrEmpty(oCustomer.UserIdAspNet))
        {
           MembershipUser oMembershipUser  = Membership.GetUser(Guid.Parse(oCustomer.UserIdAspNet));


           oCustomer.Comment = oMembershipUser.Comment;
           oCustomer.CreationDate = oMembershipUser.CreationDate;
           oCustomer.Email = oMembershipUser.Email;
           oCustomer.IsApproved = oMembershipUser.IsApproved;
           oCustomer.IsLockedOut = oMembershipUser.IsLockedOut;
           oCustomer.IsOnline = oMembershipUser.IsOnline;
           oCustomer.LastActivityDate = oMembershipUser.LastActivityDate;
           oCustomer.LastLockoutDate = oMembershipUser.LastLockoutDate;
           oCustomer.LastLoginDate = oMembershipUser.LastLoginDate;
           oCustomer.LastPasswordChangedDate = oMembershipUser.LastPasswordChangedDate;
           oCustomer.PasswordQuestion = oMembershipUser.PasswordQuestion;
           oCustomer.ProviderName = oMembershipUser.ProviderName;
           oCustomer.ProviderUserKey = oMembershipUser.ProviderUserKey;
           oCustomer.UserName = oMembershipUser.UserName;

        }


        return oCustomer;

    }

    #endregion
 }
}

现在当我尝试执行以下代码时出现错误,因为基类 ProviderUserKey 为空。

                    Customer oCustomer = CustomerManager.GetCustomer(UrlUtility.GetStringValue("UserId"));



                    //first we need to update the username                                    
                    CustomerManager.UpdateCustomerUserName(oCustomer.UserIdAspNet, this.txtEmail.Text);

                    //Insert the modified data into the object

                    oCustomer.Active = this.cbActive.Checked;
                    oCustomer.Address1 = this.txtAddress1.Text;
                    oCustomer.Address2 = this.txtAddress2.Text;
                    oCustomer.CompanyName = this.txtCompanyName.Text;
                    oCustomer.County = this.txtCounty.Text;
                    oCustomer.FirstName = this.txtFirstName.Text;
                    oCustomer.LastName = this.txtLastName.Text;
                    oCustomer.Mobile = this.txtMobile.Text;
                    oCustomer.ModifyDate = DateTime.Now;
                    oCustomer.Phone = this.txtPhone.Text;
                    oCustomer.Town = this.txtTown.Text;
                    oCustomer.Email = this.txtEmail.Text;

                    //Update The Customer table
                    CustomerManager.UpdateCustomer(oCustomer);

                    //update the membership tables
                    Membership.UpdateUser(oCustomer);

最后一行 Membership.UpdateUser(oCustomer) 出错,因为基类中的 ProviderUserKey 为空。

关于如何填充基类的任何想法,请记住 ProviderUserKey 是只读的?

代码示例(我修改过的代码)将非常有帮助和赞赏。

最佳答案

你不能。 Readonly意味着你不能设置它,你只能读取它的值。

获得正确填充的唯一方法 MembershipUser您可以通过 Membership.GetUser 进行更新,这将返回默认 MembershipUser 的一个实例类,而不是自定义类的实例。要执行您想要执行的操作,您需要创建自定义 MembershipProvider返回 Customer而不是 MemberhipUser ,但这可能比它的值(value)更麻烦。我发现效果更好的是制作 Customer “包裹”MembershipUser而不是扩展它。我已经用两种方法完成了(创建自定义 MembershipProvider 和围绕 MembershipUser 创建包装器),使用包装器绝对是更简单的方法:

public class Customer : MembershipUser
{
    #region Properties

    private MembershipUser _user;

    ....

    #region Load

    public static Customer Load(IDataReader iDataReader) 
    {
        Customer oCustomer = new Customer();
        ...

        if(!string.IsNullOrEmpty(oCustomer.UserIdAspNet))
        {
            oCustomer._user = Membership.GetUser(Guid.Parse(oCustomer.UserIdAspNet));
        }

        return oCustomer;
    }
}

然后不要隐藏只读属性,而是对它们做一些实际的事情。从 true 更改 Customer.IsLockedOut至 false意味着需要发生一些事情,所以在你的Customer.IsLockedOut属性,而不是仅仅存储一个没有任何意义的值,调用 MembershipUser.UnlockUser() :

public bool IsLockedOut
{
    get
    {
        return _user.IsLockedOut;
    }
    set
    {
        if(value != _user.IsLockedOut)
        {
            if(value)
            {
                // There's no way to programatically lock out a user, so either throw an InvalidOperationException or ignore it
            }
            else
            {
                _user.UnlockUser();
            }
        }
    }
}

如果您不希望它在您设置属性时运行,那么您需要跟踪该值是否已更改,并调用 UnlockUser()来自你的 CustomerManager.UpdateCustomer方法。

关于c# - 从 MembershipUser 继承 - Asp.net/C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6020941/

相关文章:

c# - 参数 1 : cannot convert from 'string' to 'int' error in List

c# - 不同地区不同认证方式

javascript - 使用 JavaScript 使文本框可编辑

html - 下拉选择仍然可以使用 "readonly"属性进行选择

JPA @PrePersist 和 @PreUpdate 使用继承时的顺序

c++ - 继承,定义创建指定类型对象的函数?

python - 使类在继承方面可迭代

C# 使用压缩小数编码 EBCDIC 中的文件

c# - Expression.Compile 与 Lambda 的性能,直接调用与虚拟调用

asp.net - 如何在只读表单上显示复选框(ASP.NET)