我明白viewstate是受保护的属性。这个事情在上述情景中如何实现,或者有什么其他的原因。
编辑:
我有一个页面EditFacilityworkType.aspx。在页面上我有一个用户控件FacilityWorkTypeDetails.aspx(FacilityWorkTypeDetails1)。在这个用户控件里面我有一个用户控件Workflow.aspx(Workflow1)
Page_Load()of Page
我正在page_load()页面检索工作流详细信息。
Inside usercontrol FacilityWorkTypeDetails.aspx。我有一个财产
@H_403_13@public FacilityWorktype FacilityWorkTypeDetails { get { #region Fill FacilityWorktype return GetEntityFromControl(); #endregion } set { PopulateControls(value); } } @H_403_13@FacilityWorkTypeDetails1.FacilityWorkTypeDetails = facilityWorkType;在Workflow.aspx里面,我有一个属性
@H_403_13@/// <summary> /// Property to fill entity object from controls on this page /// </summary> public WorkFlow WorkFlowDetails { get { return GetEntityFromControls(); } set { BindTranscriptionMethodDDL(ddlTranscMethod); PopulateControls(value); } }现在,在WorkWorkTypeDetails1的PopulateControls()中,我正在设置workflow1的属性
private void PopulateControls(FacilityWorktype value)
{
现在我正在从中检索值
@H_403_13@private WorkFlow GetEntityFromControls() { WorkFlow workFlow = (ViewState["WorkFlow"] as WorkFlow) ?? new WorkFlow(); //workFlow is null }解决方法
来自System.Web.UI.Control的每个控件都具有ViewState属性。该酒店是一个StateBag集合。 Control的每个实例都有自己的StateBag for ViewState,所以Scherand提到,ViewState是控件唯一的。当页面呈现时,页面的整个控制树被迭代,所有ViewState集合都被合并到一个树状结构中,并且该最终结构被序列化为字符串并呈现给页面。
因为ViewState属性被标记为受保护,所以您无法使用用户控件访问该页面的ViewState,而不使用反射。
但是,诚然,您应该放弃使用ViewState作为数据存储介质。以下是一些原因:
> ViewState被渲染并输出到客户端浏览器。维护收集中的数据对象会使您的页面的输出膨胀。
>除非您在ViewState上启用了加密功能,否则渲染到客户端浏览器的编码字符串可以手动解码,只需任何人即可访问数据对象的内容。这是一个相当重要的安全漏洞。
真的好像所有你想要做的是在你的页面和用户控件之间共享数据。在控件之间共享数据的最佳方法是使用“Items”集合(它是HttpContext类的一个属性)。该集合是一个哈希表,可以从您的页面和用户控件访问,如下所示:
@H_403_13@Context.Items["Workflow"] = workflowInstance;使用这种技术的最好的部分是它不会招致任何额外的开销或膨胀的页面输出。 Items集合存在于单个HTTP请求的上下文中。这意味着当您的请求完成并且您的Page的输出已经呈现给客户端浏览器时,Items集合将从服务器内存中清除。它是ASP.NET中临时数据存储的理想媒介。
现在,如果您希望数据对象可以访问不仅仅是当前的请求,那么最好在Session中存储对象。