MembershipUser에서 상속 - Asp.net/C#
-
14-11-2019 - |
문제
MembershipUser에서 상속받은 고객 클래스가 있습니다.
Customer 개체를 로드할 때 기본 클래스의 모든 값을 쉽게 설정할 수 있기를 원합니다.
ProviderUserKey와 같은 읽기 전용 MembershipUser 속성을 숨기는 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가 null이기 때문에 오류가 발생합니다.
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);
기본 클래스의 ProviderUserKey가 null이기 때문에 마지막 줄 Membership.UpdateUser(oCustomer)에서 오류가 발생합니다.
ProviderUserKey가 읽기 전용이라는 점을 염두에 두고 기본 클래스를 채우는 방법에 대한 아이디어가 있습니까?
코드 샘플(내 코드가 수정됨)은 정말 도움이 되고 감사할 것입니다.
해결책
당신은 할 수 없습니다. 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 변경 true
에게 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
방법.