我有一个共同的日期选择器,这个日期选择器常见于近10页,因为默认的日期选择器日期设置为当前日期,我有一个页面(10页中的1页)带链接,当我选择该链接时,它包含一些日期(未来或过去),所以我希望链接选择日期显示在日期选择器控件上,目前我能够做到,我面临的问题是,相同的更改日期反映到其他9页我不需要,我应该能够看到它们的默认日期,即当前日期。
代码:
特定页面的方法我将其设置为特定日期
protected void QuickListDateNavigate(object sender, CommandEventArgs e)
{
DateTime newDate = DateTime.Parse((string)e.CommandArgument);
this.Parent.SessionObj.ViewDate = newDate;
}
这是将上面选择的日期设置为链接所选日期以及其他9个页面的位置。
Datepicker.ascx.cs
protected override void OnPreRender(EventArgs e)
{
if (this.m_showDateText)
{
if (datepicker.Value == "")
{
PickerDate = ViewDate;
}
else
{
// ViewDate = DateTime.Parse(datepicker.Value);
ViewDate = this.Parent.SessionObj.ViewDate;
PickerDate = ViewDate;
}
}
base.OnPreRender(e);
}
之前它是注释行,它设置了当前日期,添加了下一个链接" ViewDate = this.Parent.SessionObj.ViewDate;"这改变了我预期的日期。
public DateTime ViewDate
{
get
{
return Parent.SessionObj.ViewDate;
}
set
{
Parent.SessionObj.ViewDate = value;
}
}
protected DateTime PickerDate
{
get
{
DateTime newDate = ViewDate;//Use current ViewDate if Value in textbox is not valid.
string pickerValue = this.Parent.SessionObj.ViewDate.ToString();
try
{
newDate = DateTime.Parse(pickerValue);
}
catch
{
//Date was not a valid format fill in with the ViewDate
SetPickerDateToViewDate();
}
return newDate;
}
set
{
this.datepicker.Value = value.ToString(this.m_dateFormatString);
}
}
protected void SetPickerDateToViewDate()
{
PickerDate = ViewDate;
}
因此,一旦将日期更改为我的要求,则不会将其设置回其他页面的当前日期,是否有任何方法可以将更改日期更改为特定页面以及其他页面的默认日期?
答案 0 :(得分:1)
问题是您正在使用用户控件的父级(托管用户控件的.aspx
页面)来获取ASP.NET Session
对象。然后,此会话对象通过此属性逻辑用于所有10个用户控件实例:
public DateTime ViewDate
{
get
{
return Parent.SessionObj.ViewDate;
}
set
{
Parent.SessionObj.ViewDate = value;
}
}
用户控件(子)与父级紧密耦合通常是一个坏主意。如果您尝试在SessionObj
不存在的情况下使用此用户控件,那么它将以惊人的方式显然爆炸。这严重限制了所述用户控件的可重用性。
您希望父(.aspx
页面)告诉孩子(.ascx
用户控件)ViewDate
的值是什么。在您发布的代码中,您的子控件正在询问父级"嘿,查看日期的会话缓存中的值是什么?"。
将您的用户控制代码更改为以下内容:
private DateTime myViewDate;
public DateTime ViewDate
{
get
{
return myViewDate;
}
set
{
myViewDate = value;
}
}
现在在应用用户控件的页面中,最初将ViewDate
属性的值设置为会话值,然后在该页面上更新需要通过属性的setter更改的一个实例实际上修改了值。