【问题标题】:Pass literal control from one page to another将文字控制从一页传递到另一页
【发布时间】:2012-12-26 20:57:52
【问题描述】:

我在 Page1 中有这个文字控件:

 string s1 = "<table>"
           + "<tr>"
           + "<td>AAA</td>"
           + "<td>AAA</td>"
           + "</tr>"
           + "<tr>"
           + "<td>BBB</td>"
           + "<td>BBB</td>"
           + "</tr>"
           + "</table>"
           + "<br />";

 string s2 = "<input type=\"button\" onclick=\"window.open('Page2.aspx','','Height=500,width=500')\" value=\"pop up\" />";

 LiteralControl lc = new LiteralControl(s1 + s2);
 Div1.Controls.Add(lc);

如您所见,它是一个简单的 HTML 表格和按钮。
我要做的是点击按钮,弹出Page2.aspx,将不带按钮的文字控件(lc)添加到Page2.aspx(Div1)中的一个Div中。

我无法让它工作。
Page1 不得回传到服务器来完成此操作。

【问题讨论】:

  • @SWeko - 不。对不起,如果我让它听起来像它。
  • 你必须意识到这将是可怕的不安全的。
  • @SystemDown - 这个项目没问题。
  • 你想完成什么?我相信会有一种更安全、更理智的方法。
  • @SystemDown - 我有一份报告需要一段时间才能加载。我希望有一个打印/CSV/Excel 按钮来临时在弹出窗口中打开表格,而不必发回服务器以再次获取数据。还希望不必使用会话对象来存储数据。

标签: c# javascript jquery vb.net


【解决方案1】:

页面之间传递数据的方式只有三种:

  • 获取值

  • POST 值

  • 服务器变量(会话...等)

服务器变量是最灵活的解决方案,如果使用得当,不会对性能造成严重影响。但是你已经排除了这个选项。

POST 值是另一种选择。它们存储在表单内的 HiddenFields 中,但您需要提交表单才能使用它们。而且由于您使用的链接会打开一个弹出窗口,因此这不是一个好的解决方案。

这会留下 GET 值。它将值存储在 URL 的查询字符串中。这工作,但它有大约 8 KB 的大小限制。如果您可以将 HTML 的大小保持在该范围内,那么您需要做的是Base64 encode HTML(这不是加密它,它只是将它打包成一个整洁的字符串),使用编码的字符串作为一部分的 URL(即“Page2.aspx?data=SomeString”),然后在 Page2 中使用 Request.Params["data"] 获取该值,然后 Base64 对其进行解码,并将该值放入本地文字控件中。

但是,您的价值似乎远不止于此。这样您就可以使用服务器变量,或者将您的 HTML 存储在某处并传递对它的引用。例如,您可以将生成的 HTML 保存在具有唯一标识符键的数据库中,然后将键传递给 Page2,Page2 将在数据库中查询实际的 HTML。

【讨论】:

    【解决方案2】:

    这是一种糟糕的编程方式,您应该 .aspx 页面处理 HTML,而 Code behind 部分处理数据。

    例如,将数据(例如您的DataTable)添加到会话对象,或者在您简单的操作处使用GridView 控件:

    myGridView.DataSource = dt;
    myGridView.DataBind();
    

    并且因为您重复使用相同的东西,您可以使用带有myGridView 的用户控件

    这样,您不会在代码处理页面上处理 HTML 格式,而是在重复使用控件,如果明天发生任何事情,您可以轻松更改一个文件,并且所有具有该控件的位置都将被修改自动。


    如果您仍然不太关心体面的编程规则,您可以将 Literal 控件添加到,例如,会话对象并在第二页上调用它:

    LiteralControl lc = new LiteralControl(s1 + s2);
    
    // Add control to a Session instance
    Session["myLiteralControl"] = lc;
    
    Div1.Controls.Add(lc);
    

    在您的其他页面中:

    LiteralControl lc = (Literal)Session["myLiteralControl"];
    Div1.Controls.Add(lc);
    

    【讨论】:

    • 这可能看起来是一种糟糕的编程方式,但你不知道这个项目的具体细节,你不知道它是公共、私人还是内网站点。你怎么能这么说?...另外,我意识到我可以使用会话对象,但我试图避免走那条路。
    • @Administrateur - 那么最好提供有关您的项目的更多细节。具体来说,您要实现什么目标,以及为什么要考虑这样做。此外,您从未提到您的问题中不使用会话。
    • 不管是什么项目,“如果你在做某事,总是尽力而为!”与其抱怨,不如向别人学习.. .正如@SystemDown所说,这件事没有细节,你应该再看看你自己的问题,这里我们只是互相帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 2017-07-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多