我有一个继承自 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/