2012-01-06 2 views
0

Недавно я работал над небольшим приложением, которое состоит из индексной страницы, содержащей несколько отчетов, запускаемых из базы данных, а затем некоторые формы для обновления содержимого этой страницы, все в ASP.NET используя 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"); 
    } 

Page_Load из Default.aspx:

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

Outline класса Report - это в основном обертка для различных отчетов я, указанных в createChartFromParameters() метод. Он просто выполняет всю работу по настройке диаграммы, чтобы она не попадала в пользовательский интерфейс, а затем позволяет пользовательскому интерфейсу сам взять объект диаграммы. Я могу опубликовать эту версию, если кто-то найдет ее полезной, но она уродливая, как что-то, и действительно довольно длинная, поэтому я бы предпочел.

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 прекращает выполнение и немедленно перенаправляет ответ.redirect завершит выполнение и, возможно, будет запущен какой-то непреднамеренный код, который вызвал проблему – user1231231412

+0

. Я выложу какой-то код только для интереса, но, честно говоря, я не думаю, что могу опубликовать достаточно - чтобы действительно посмотреть, что происходит. d нужно загрузить примерно половину кода приложения, и я действительно не хочу, чтобы кто-то через пытку читал большую часть моего кода: P – Hecksa

+0

** Обновление **: добавлен код. – Hecksa

ответ

1

Я считаю, что это непонимание того, как объект сервера и объект ответа выполнить Перенаправление

Он имеет много общего с тем, как клиент перенаправляется на новый ресурс, и с какой целью он делает это и к каким объектам он имеет доступ после этого.

Я мог бы набрать все, но здесь есть хороший ресурс.

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

+0

Отличная статья, спасибо. Некоторое время я искал что-то подобное, но не мог найти его настолько тщательным. Прочитав это, я не вижу, что вызвало разницу в моей ситуации. Мой код работал нормально, когда страница загружалась из ничего, что, по-видимому, делает Response.Redirect, и я не вижу никакого кода, который все еще может работать во время процесса перенаправления, как сказал Jon C в своем комментарии. Есть ли какая-то принципиальная разница между Response.Redirect и, скажем, панель URL браузера? Я считаю, что оба делают http-запросы с нуля, так что результат не должен быть идентичным? – Hecksa

+0

Не совсем, Response.Redirect фактически останавливает текущий объект ответа мертвым и запускает новый и генерирует новый, отсюда исключение ThreadAbort, как описано здесь http://msdn.microsoft.com/en-us/library/a8wa7sdt % 28VS.80% 29.aspx Ввод URL-адреса в адресной строке запускает новый жизненный цикл страницы. Я подозреваю, что это то, почему обновление работало там, где перенаправления не было. – Sabre

+0

Gotcha. Если Response.Redirect не запускает целый новый жизненный цикл, тогда есть несколько вещей, которые я могу думать о том, что это может отсутствовать, что вызвало бы проблему. Большое спасибо :) – Hecksa

Смежные вопросы