2011-05-16 66 views
2

我有一个继承自MembershipUser的客户类。继承自MembershipUser - Asp.net/C#

当我加载一个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为null。

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

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

回答

1

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

只有这样,才能得到正确填充MembershipUser您可以更新是通过Membership.GetUser,这是会返回默认MembershipUser类,而不是您的自定义类的实例的实例。要做你想做的事情,你需要创建一个自定义MembershipProvider,返回Customer而不是MemberhipUser,但这可能比它的价值更麻烦。我发现的更好的作法是让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; 
    } 
} 

然后,而不是隐藏只读属性,实际上是做一些与他们。更改Customer.IsLockedOut从truefalse意味着什么需要做的,所以在你的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(); 
      } 
     } 
    } 
} 

如果你不希望出现这种情况要在设置属性时运行,则需要跟踪值是否更改,并从CustomerManager.UpdateCustomer方法中调用UnlockUser()

+0

谢谢@Joel C,这是我正在寻找的解决方案。在这种情况下,它提供了我需要的所有功能,而且我不必花费时间创建自定义MembershipProvider。干杯。 – Frawls 2011-05-17 09:15:19