我有一个面板(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;
}
}
但它不起作用。可能吗?我想这样做的原因是因为开销不是问题,我想减少编码时间。
答案 0 :(得分:1)
我自己从未尝试过,但在我看来,这似乎是一个非常糟糕的主意。没有测试它,我的猜测是这会产生大量的ViewState问题。即使您可以维护ViewState,尝试将此控件保持在多个页面加载上也是危险的。
我的建议是拥有一个包含所需面板属性的公共对象,并在一个早期事件中构建一个方法,以预先填充具有这些属性的新面板。
答案 1 :(得分:0)
如果不知道做这样的事情的全部原因,你应该看一下输出缓存指令。通过将内容从面板中拉出并进入用户控件,可以获得最佳效果。然后使用VaryByCustom在控件上设置输出缓存,以便您可以使用用户名或其他一些唯一标识符来按用户分隔。
http://msdn.microsoft.com/en-us/library/hdxfb6cy.aspx和 http://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