代码片断:
#region Credit Card Info Fields
/// <summary>
/// 在页面回传过程中,为了保持值的一致性,ViewState集合作为内部存储
/// </summary>
public PaymentMethod PaymentMethod
{
get { return ViewState["PaymentMethod"] != null ? (PaymentMethod)ViewState["PaymentMethod"] : PaymentMethod.VISA; }
set { ViewState["PaymentMethod"] = value; }
}
public string CreditCardNo
{
get { return ViewState["CreditCardNo"] != null ? (string)ViewState["CreditCardNo"] : string.Empty; }
set { ViewState["CreditCardNo"] = value; }
}
public string CardholderName
{
get { return ViewState["CardholderName"] != null ? (string)ViewState["CardholderName"] : string.Empty; }
set { ViewState["CardholderName"] = value; }
}
public DateTime ExpirationDate
{
get { return ViewState["ExpirationDate"] != null ? (DateTime)ViewState["ExpirationDate"] : DateTime.Now; }
set { ViewState["ExpirationDate"] = value; }
}
private bool hasPaymentMethodChanged;
private bool hasCreditCardNoChanged;
private bool hasCardholderNameChanged;
private bool hasExpirationDateChanged;
#endregion
#region 事件回传
/// <summary>
/// 调用签名方法 提供了继承类和自己的实现
/// </summary>
/// <param name="args"></param>
void IPostBackEventHandler.RaisePostBackEvent(string args)
{
RaisePostBackEvent(args);
}
/// <summary>
/// 作为回发事件和回发数据之间的桥梁
/// </summary>
/// <param name="args"></param>
protected virtual void RaisePostBackEvent(string args)
{
//使用事件数据或者信用卡信息创建一个ValidatingCreditCardEventArgs对象
// 注意此刻数据已经用了 来自 ValidatingCreditCardEventArgs类的私有字段
//
ValidateCreditCardEventArgs ve = new ValidateCreditCardEventArgs(PaymentMethod, CreditCardNo, CardholderName, ExpirationDate);
//触发事件
OnValidatingCreditCard(ve);
}
#endregion
#region 数据回传
//----------------------------------------------------------------------
// 当点击submit 按扭,表单数据被回传到服务器 ,控件6必须访问回传的表单数据,
// 已获取选中的值和过期的时间和文本 等输入的HTML元素, 然后使这些值生成
// ValidatingCreditCardEventArgs对象 ,如事例 #region Events 例子
// 实现 IPostBackDataHandler接口 以便访问回传表单的数据
//----------------------------------------------------------------------
/// <summary>
///当点击submit 按扭,表单数据被回传到服务器时,页面将调用LoadPostData()方法,
/// 并将回传表单数据的NameValueCollection类型的集合传递给该方法
/// </summary>
/// <param name="postDataKey"></param>
/// <param name="values"></param>
/// <returns></returns>
bool IPostBackDataHandler.LoadPostData(string postDataKey, NameValueCollection values)
{
return LoadPostData(postDataKey, values);
}
/// <summary>
/// 从客户端得到值,
/// 1)复制给如果值跟原来的不同就跟新以前的属性值,
/// 2)设置带有BOOLEAN的私有字段,
/// </summary>
/// <param name="postDataKey"></param>
/// <param name="values">元素NAME属性值(回传服务器的值)属性名
/// 做为NameValueCollection的索引,从而实现对相关元素值的访问</param>
/// <returns>***任何一个改变就返回TURE</returns>
protected virtual bool LoadPostData(string postDataKey, NameValueCollection values)
{
PaymentMethod paymentMethod = values[PaymentSeleteMethod] == "0" ? PaymentMethod.VISA : PaymentMethod.MASTERCARD;
if (paymentMethod != PaymentMethod)
{ // ^^赋值给 ValidateCreditCardEventArgs.cs 的属性
PaymentMethod = paymentMethod;
hasPaymentMethodChanged = true;
}
string creditCardNo = values[CreditCardNoText];
if (creditCardNo != CreditCardNo)
{
CreditCardNo = creditCardNo;
hasCreditCardNoChanged = true;
}
string cardholderName = values[CreditHolderText];
if (cardholderName != CardholderName)
{
CardholderName = cardholderName;
hasCardholderNameChanged = true;
}
int month = int.Parse(values[ExpirationMonthSelect]);
int year = int.Parse(values[ExpirationYearSelect]);
DateTime expirationDate = new DateTime(year, month, 25);
if (expirationDate != ExpirationDate)
{
ExpirationDate = expirationDate;
hasExpirationDateChanged = true;
}
if (!string.IsNullOrEmpty(values[SubmitText]))
Page.RegisterRequiresRaiseEvent(this);
return hasPaymentMethodChanged ||
hasCreditCardNoChanged ||
hasCardholderNameChanged ||
hasExpirationDateChanged;
}
/// <summary>
/// 显示转换接口类型
/// </summary>
void IPostBackDataHandler.RaisePostDataChangedEvent()
{
RaisePostDataChangedEvent();
}
/// <summary>
///检查BOOLEAN的私有字段的某个值
/// 根据已经设置的私有变量的值看属性是否更改
/// TRUE就触发相关的事件
/// </summary>
protected virtual void RaisePostDataChangedEvent()
{
if (hasPaymentMethodChanged)
OnPaymentMethodChanged(EventArgs.Empty);
if (hasCreditCardNoChanged)
OnCreditCardNoChanged(EventArgs.Empty);
if (hasCardholderNameChanged)
OnCardholderNameChanged(EventArgs.Empty);
if (hasExpirationDateChanged)
OnExpirationDateChanged(EventArgs.Empty);
}
#region 事件定义(事件设计模式)
private static readonly object ValidatingCreditCardEventKey = new object();
/// <summary>
/// ValidatingCreditCardEventHandler 类型
/// 事件的实现,
/// 必须使用ValidatingCreditCardEventKey事件键作为EVENTS集合的索引
/// 以便访问事件委托
/// </summary>
public event ValidateCreditCardEventHandler ValidatingCreditCard
{
add { Events.AddHandler(ValidatingCreditCardEventKey, value); }
remove { Events.RemoveHandler(ValidatingCreditCardEventKey, value); }
}
/// <summary>
/// 实现一个引发事件的方法
/// </summary>
/// <param name="e"></param>
protected virtual void OnValidatingCreditCard(ValidateCreditCardEventArgs e)
{
ValidateCreditCardEventHandler handler = Events[ValidatingCreditCardEventKey] as ValidateCreditCardEventHandler;
if (handler != null)
handler(this, e);
}
private static readonly object PaymentMethodChangedEventKey = new object();
public event EventHandler PaymentMethodChanged
{
add { Events.AddHandler(PaymentMethodChangedEventKey, value); }
remove { Events.RemoveHandler(PaymentMethodChangedEventKey, value); }
}
protected virtual void OnPaymentMethodChanged(EventArgs e)
{
EventHandler handler = Events[PaymentMethodChangedEventKey] as EventHandler;
if (handler != null)
handler(this, e);
}
private static readonly object CreditCardNoChangedEventKey = new object();
public event EventHandler CreditCardNoChanged
{
add { Events.AddHandler(CreditCardNoChangedEventKey, value); }
remove { Events.RemoveHandler(CreditCardNoChangedEventKey, value); }
}
protected virtual void OnCreditCardNoChanged(EventArgs e)
{
EventHandler handler = Events[CreditCardNoChangedEventKey] as EventHandler;
if (handler != null)
handler(this, e);
}
private static readonly object CardholderNameChangedEventKey = new object();
public event EventHandler CardholderNameChanged
{
add { Events.AddHandler(CardholderNameChangedEventKey, value); }
remove { Events.RemoveHandler(CardholderNameChangedEventKey, value); }
}
protected virtual void OnCardholderNameChanged(EventArgs e)
{
EventHandler handler = Events[CardholderNameChangedEventKey] as EventHandler;
if (handler != null)
handler(this, e);
}
private static readonly object ExpirationDateChangedEventKey = new object();
public event EventHandler ExpirationDateChanged
{
add { Events.AddHandler(ExpirationDateChangedEventKey, value); }
remove { Events.RemoveHandler(ExpirationDateChangedEventKey, value); }
}
protected virtual void OnExpirationDateChanged(EventArgs e)
{
EventHandler handler = Events[ExpirationDateChangedEventKey] as EventHandler;
if (handler != null)
handler(this, e);
}
#endregion
#endregion