2012-01-06 39 views
0

我一直在研究一个小应用程序,它最近由一个索引页面组成,这个索引页面包含几个运行数据库的报表,然后是一些用于更新该页面内容的表单使用C#,以便将来学习如何使用MSCharts。Response.Redirect和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); 
    } 

报告类概要 - 这基本上是我在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) 
} 
+0

很难说,不看代码。我唯一能猜到的就是Server.Transfer停止执行并立即重定向响应的地方。重定向将完成执行,并可能有一些意外的代码正在运行,产生问题 – user1231231412 2012-01-06 14:26:17

+0

我会弹出一些代码,只是为了兴趣,但说实话我不认为我可以发布足够的 - 真正看到发生了什么我' d需要上传大约一半的应用程序代码,并且我不想让任何人通过阅读我的许多代码的折磨:P – Hecksa 2012-01-06 14:37:20

+0

**更新**:添加了代码。 – Hecksa 2012-01-06 14:49:45

回答

1

我相信这是一个如何在服务器对象和响应对象进行重定向

它有很多做的客户端如何重定向到新的资源,并从什么目的的误解它这样做,以及之后可以访问哪些对象。

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

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

+0

伟大的文章,谢谢。我寻找这样的一段时间,但找不到一个彻底。 虽然看过了,但我看不出是什么导致了我的情况有所不同。我的代码在页面从无内容加载时运行良好,这正是Response.Redirect似乎在做的事情,我看不到任何代码在重定向过程中仍可能正在运行,正如Jon C在他的评论中所建议的。 Response.Redirect和浏览器的URL栏之间是否存在一些根本区别?我相信都从头开始HTTP请求,所以不应该结果是相同的? – Hecksa 2012-01-06 15:07:40

+0

并非如此,Response.Redirect实际上是停止当前响应对象并启动一个新对象,并生成一个新对象,因此ThreadAbort异常如http://msdn.microsoft.com/en-us/library/a8wa7sdt %28VS.80%29.aspx在地址栏输入网址开始一个新的页面生命周期。我怀疑这就是为什么刷新工作的重定向没有。 – Sabre 2012-01-06 15:14:10

+0

Gotcha。如果Response.Redirect没有开始一个全新的生命周期,那么我可以想到有几件事情可能会导致问题的产生。非常感谢 :) – Hecksa 2012-01-06 15:24:31