【问题标题】:Response.Redirect and MSChartsResponse.Redirect 和 MSCharts
【发布时间】:2012-01-06 14:22:27
【问题描述】:

我最近一直在开发一个小型应用程序,它由一个索引页面组成,其中包含一些从数据库运行的报告,然后是一些用于更新该页面内容的表单,所有这些都在 ASP.NET 中使用 C#学习如何在未来使用 MSCharts。

索引页面可以显示我设置的 5 个报告中的任何一个,这些报告是通过下拉框选择的。默认情况下,第一个被选中,这样页面上应该总是显示一个图表。

我让图表正常工作并在索引页面上显示我想要的内容,更新数据库的表单也完成了他们的工作。但是,当我单击其中一个页面上的“退出”按钮(将用户返回到索引页面)时,应该在那里显示的图表只是一个红色的“x”,就好像图像不存在一样.如果我刷新页面,它应该会出现。

当时的退出按钮使用 Response.Redirect() 将用户返回到索引页面,我花了一些时间确认这是正确的方法。最后,我尝试改用 Server.Transfer(),尽管每个站点似乎都表明两者在页面执行周期方面没有重大区别——只有 Response.Redirect() 发送了一个整体新请求,而 Server.Transfer 没有。

尽管如此,使用 Server.Transfer() 解决了这个问题。嗯,太好了!

谁能解释一下为什么会这样?

更新 - 一些代码,以防万一。

更新表单中有问题的事件之一 - 当然最初使用的是 Response.Redirect()。

    protected void Exit_Click(object sender, EventArgs e)
    {
        Server.Transfer("Default.aspx");
    }

来自 Default.aspx 的 Page_Load:

    protected void Page_Load(object sender, EventArgs e)
    {
        Report report = new Report(reportList.SelectedIndex);
        ChartPanel.Controls.Add(report.Chart);
    }

Report 类的大纲 - 这基本上是我在 createChartFromParameters() 方法中指定的各种报告的包装器。它只是完成了设置图表的所有工作,因此它不会出现在 UI 中,然后让 UI 获取图表对象本身。如果有人觉得它有用,我可以发布实现,但它很丑陋,而且真的很冗长,所以我宁愿不这样做。

public class Report
{
    private Chart chart { public get; }

    public Report(string title, string command, string x, string y, string label, string legend, SeriesChartType type)

    public Report(int presetChartNum)

    private void createChartFromParameters(string title, string command, string x, string y, string label, string legend, SeriesChartType type, int customcode = 0)  
}

【问题讨论】:

  • 不看代码就很难判断。我唯一能猜到的是 Server.Transfer 停止执行并立即重定向 response.redirect 将完成执行的位置,并且可能正在运行一些导致问题的意外代码
  • 我会弹出一些代码只是为了感兴趣,但老实说我认为我不能发布足够多的内容 - 要真正了解发生了什么,我需要上传大约一半的应用程序代码,而且我真的不想让任何人经历阅读我那么多代码的折磨:P

标签: c# asp.net mschart


【解决方案1】:

我认为这是对服务器对象和响应对象如何执行重定向的误解

这与客户端如何重定向到新资源以及它从什么端重定向以及之后它可以访问哪些对象有很大关系。

我可以全部输入,但这里有一个很好的资源。

http://techahead.wordpress.com/2007/10/14/aspnet-servertransfer-vs-responseredirect/

【讨论】:

  • 很棒的文章,谢谢。我找了一段时间这样的东西,但找不到那么彻底。但是,读完之后,我看不出是什么导致了我的情况有所不同。当页面从零加载时,我的代码运行良好,这就是 Response.Redirect 似乎正在做的事情,而且我看不到任何在重定向过程中可能仍在运行的代码,正如 Jon C 在他的评论中所建议的那样。 Response.Redirect 和浏览器的 URL 栏之间有什么根本区别吗?我相信两者都是从头开始发出http请求的,所以结果不应该是相同的吗?
  • 不是真的,Response.Redirect 实际上是停止当前响应对象死并启动一个新响应对象并生成一个新响应对象,因此此处记录的 ThreadAbort 异常msdn.microsoft.com/en-us/library/a8wa7sdt%28VS.80%29.aspx 在地址栏中输入 url开始一个新的页面生命周期。我怀疑这就是为什么在重定向不起作用的情况下刷新起作用的原因。
  • 明白了。如果 Response.Redirect 没有开始一个全新的生命周期,那么我能想到的一些事情可能会导致问题。非常感谢:)
猜你喜欢
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 2012-08-25
  • 1970-01-01
相关资源
最近更新 更多