微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net – 为什么我无法访问usercontrol中的页面viewstate?

我在一个页面上的viewstate中存储了一个对象。现在当我访问userControl上的相同视图对象时,它显示为null。我甚至尝试在usercontrol和page.B中创建与该名称相同的视图状态。其持有不同的值。

我明白viewstate是受保护的属性。这个事情在上述情景中如何实现,或者有什么其他的原因。

编辑:

用户控件在页面标记中。我没有动态加载它。

我有一个页面EditFacilityworkType.aspx。在页面我有一个用户控件FacilityWorkTypeDetails.aspx(FacilityWorkTypeDetails1)。在这用户控件里面我有一个用户控件Workflow.aspx(Workflow1)

Page_Load()of Page
我正在page_load()页面检索工作流详细信息。

FacilityWorktype facilityWorkType = facilityDetails.GetFacilityWorktypeDetail(SessionHelper.FacilityWorkTypeID);
 ViewState["WorkFlow"] = facilityWorkType.FacilityWorkTypeWorkFlow

Inside usercontrol FacilityWorkTypeDetails.aspx。我有一个财产

public FacilityWorktype FacilityWorkTypeDetails
{
    get
    {
        #region Fill FacilityWorktype
        return GetEntityFromControl();
        #endregion
    }
    set
    {
        PopulateControls(value);
    }
}

现在我设置页面页面加载属性

FacilityWorkTypeDetails1.FacilityWorkTypeDetails = facilityWorkType;

在Workflow.aspx里面,我有一个属性

/// <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)
{

Workflow1.WorkFlowDetails = value.FacilityWorkTypeWorkFlow;
}

现在我正在从中检索值

private WorkFlow GetEntityFromControls()
 {
     WorkFlow workFlow = (ViewState["WorkFlow"] as WorkFlow) ?? new WorkFlow();  
     //workFlow  is null

 }

所以现在这函数workFlow是null。我想问,为什么当我在页面中设置viewstate时为空。

解决方法

Scherand在这里非常正确。我想补充一下他带给桌子的东西。

来自System.Web.UI.Control的每个控件都具有ViewState属性。该酒店是一个StateBag集合。 Control的每个实例都有自己的StateBag for ViewState,所以Scherand提到,ViewState是控件唯一的。当页面呈现时,页面的整个控制树被迭代,所有ViewState集合都被合并到一个树状结构中,并且该最终结构被序列化为字符串并呈现给页面

因为ViewState属性标记为受保护,所以您无法使用用户控件访问该页面的ViewState,而不使用反射。

但是,诚然,您应该放弃使用ViewState作为数据存储介质。以下是一些原因:

> ViewState被渲染并输出到客户端浏览器。维护收集中的数据对象会使您的页面输出膨胀。
>除非您在ViewState上启用了加密功能,否则渲染到客户端浏览器的编码字符串可以手动解码,只需任何人即可访问数据对象的内容。这是一个相当重要的安全漏洞。

真的好像所有你想要做的是在你的页面用户控件之间共享数据。在控件之间共享数据的最佳方法是使用“Items”集合(它是HttpContext类的一个属性)。该集合是一个哈希表,可以从您的页面用户控件访问,如下所示:

Context.Items["Workflow"] = workflowInstance;

使用这种技术的最好的部分是它不会招致任何额外的开销或膨胀的页面输出。 Items集合存在于单个HTTP请求的上下文中。这意味着当您的请求完成并且您的Page的输出已经呈现给客户端浏览器时,Items集合将从服务器内存中清除。它是ASP.NET中临时数据存储的理想媒介。

现在,如果您希望数据对象可以访问不仅仅是当前的请求,那么最好在Session中存储对象。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐