2011-05-16 26 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