无法将“System.String”类型的对象强制转换为“System.Web.UI.Control”类型

时间:2013-11-28 14:59:36

标签: c# asp.net string controls asp.net-webcontrol

我被困在这里,

我有要打印的动态表格。所以我创建会话将其传递给Web控件。 不幸的是,它并不顺利。

以下是我的代码:

protected void bt_print_click(object sender, EventArgs e)
{
    StringWriter sw = new StringWriter();
    HtmlTextWriter w = new HtmlTextWriter(sw);
    panelBilling.RenderControl(w);
    string s = sw.GetStringBuilder().ToString();
    Session["ctrl"] = s;

    ClientScript.RegisterStartupScript(this.GetType(), "onclick", "<script language=javascript>window.open('Print.aspx?rep=1','PrintMe','height=680px,width=1024px,scrollbars=1');</script>");

}

Print.aspx.cs代码:

protected void Page_Load(object sender, EventArgs e)
{
    Control ctrl = (Control)Session["ctrl"];
    PrintHelper.PrintWebControl(ctrl);
}

我总是收到错误消息:

  

“无法将类型为'System.String'的对象强制转换为类型   'System.Web.UI.Control'。“

on

(Control)Session["ctrl"]

一部分。我以前用过很多次这个方法而没有问题。任何人有任何想法?感谢。

1 个答案:

答案 0 :(得分:0)

这没有意义,将字符串值转换为Control。

据我所见,你没有在Sessiosn中插入一个Control,甚至没有Control.ToString()值,这也是无效的。

在继续之前,检查从Session中检索的类型而不进行任何操作可能是有用的(注释:这仅适用于.NET 3.5或更高版本):

var sessionValue = Session["ctrl"];

执行此操作时,您将发现值为object类型,包含值:

"<div>\r\n\r\n</div>"

上面的输出不是Control,而是字符串/ html值。

您可以遵循两种解决方案路径:

  • 更改会话
  • 上的“SET”调用
  • 更改会话
  • 上的“GET”电话

在第二个例子中,你继续说明你要插入一个字符串,因此你想要读出那个字符串值:

string sessionValueAsString = string.Empty;
Object sessionValue = Session["ctrl"];

if (sessionValue != null)
    sessionValueAsString = sessionValue.ToString();

以上示例可能适合您的需求,我猜测您需要在会话中保存“Control”类型的对象。这可以这样实现:

MyControl myControl = new MyControl {Title = "My custom control"};
Session["myControl"] = myControl;
// Read the Session value cross Postback
MyControl mySessionControl = (MyControl)Session["myControl"];

除了上面的例子,我不是百分之百确定你要做什么。 我的猜测是你在Session中插入错误的值时犯了一个错误。

一句话:我不喜欢在会话中存储WebControl,将数据对象存储在Session中会更简洁(例如存储Customer类而不是CustomerUserControl,这样你就可以读出使用Session中的数据对会话进行填充并填充所需的控件。