在Web对象中保存webControl

时间:2012-02-09 16:22:54

标签: c# asp.net session

我有一个面板(pnlPanel),有许多控件,如Textboxes and DropDownLists。当用户回到页面时,我希望它们是持久的,所以我尝试了这个:

/*i have saved the panel like this 
  Session["testPanel"] = pnlTest;
*/

protected void Page_Load(object sender, EventArgs e)
{       
    if (Session["testPanel"] != null)
    {
        panel = Session["testPanel"] as Panel;
    }
}

但它不起作用。可能吗?我想这样做的原因是因为开销不是问题,我想减少编码时间。

5 个答案:

答案 0 :(得分:1)

我自己从未尝试过,但在我看来,这似乎是一个非常糟糕的主意。没有测试它,我的猜测是这会产生大量的ViewState问题。即使您可以维护ViewState,尝试将此控件保持在多个页面加载上也是危险的。

我的建议是拥有一个包含所需面板属性的公共对象,并在一个早期事件中构建一个方法,以预先填充具有这些属性的新面板。

答案 1 :(得分:0)

如果不知道做这样的事情的全部原因,你应该看一下输出缓存指令。通过将内容从面板中拉出并进入用户控件,可以获得最佳效果。然后使用VaryByCustom在控件上设置输出缓存,以便您可以使用用户名或其他一些唯一标识符来按用户分隔。

http://msdn.microsoft.com/en-us/library/hdxfb6cy.aspxhttp://msdn.microsoft.com/en-us/library/system.web.httpapplication.getvarybycustomstring.aspx

如果您处于webfarm场景中,使用会话和/或缓存将会出现问题。缓存范围限定为应用程序实例,因此Web场中的另一台服务器将无法访问它。

此类事件的其他一些副作用包括viewstate问题。

答案 2 :(得分:0)

第一种方法


protected void Page_Load(object sender, EventArgs e)
{       
    if (ViewState["panel"] != null)
    {
        panel = ViewState["panel"] as Panel;
    }
}

在这种方法中,ViewState对象是不同的。一旦ViewState["panel"]被赋予控制记忆,并且在会话为Session["panel"]

的印象中访问对象,您可能会获得一些空值

第二种方法


完整面板HTML 保存在数据库中,并通过将该功能保留在IsPostBack下,在表单加载上访问它。

现在有了方法的连续性 - 2将值分配给会话对象。

this.Controls.Add(new LiteralControl("Your HTML"));

第三种方法


您可以使用文件系统。将div保存在文件中并在运行时访问该文件。

希望这可以帮助你。


编辑 - 1 =>添加了第二种方法的代码

答案 3 :(得分:0)

您尝试在此处执行的操作是缓存Panel,但这不是方法。保存它时面板是内存中的运行对象,无法保存。您需要将其转换为html字符串并保存并缓存此字符串。因此,在Panel附近放置一个文字,然后渲染Panel并将其保存在会话中,然后实际显示此渲染中的文本。

if(Session["testPanel"] == null)
{
    TextWriter stringWriter = new StringWriter();
    HtmlTextWriter renderOnMe = new HtmlTextWriter(stringWriter);
    // render and get the actually html of this dom tree
    testPanel.RenderControl(renderOnMe);
    // save it as cache
    Session["testPanel"] = stringWriter.ToString();     
}
// render the result on a literal 
cLiteralID.Text = Session["testPanel"];
// hide the panel because I have render it on literal.
testPanel.Visible = false;

需要进行一些测试。我使用一些类似的代码进行自定义控制和自定义缓存,从不在会话中节省这么多数据。

答案 4 :(得分:0)

我有类似的问题。我试图将对象保存到存储Panel的View State,我收到一条错误消息,告诉我Panels不可序列化。您可以尝试使用SerializationSurrogate。 https://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializationsurrogate(v=vs.110).aspx