2013-10-25 1 views
0

фона: Я работаю на существующий WebForms сайт, который мы конвертируем в MVC 4. Мы также обновление пользовательского интерфейса так делают новые страницы MVC макета для замены старых WebForms мастер-страниц. Мы не можем обновлять все страницы aspx до mvc сразу, поэтому, чтобы поддерживать последовательный просмотр сайта, существующие aspx, которые еще не были преобразованы, отображаются внутри макета MVC. Мы используем маршрутизацию MVC для отправки URL-адресов, таких как ~/pageName.aspx, в MVC-контроллер (с соответствующим представлением), который использует Server.Execute, чтобы получить тело aspx для рендеринга в макете MVC. До этого момента он работает нормально.состояния сеанса в Гибридные WebForms/MVC приложение

Проблема: В нескольких местах в существующем коде aspx позади находятся определенные элементы SessionState. По какой-то причине я не могу раскрыть, когда страница перенаправляется (т. Е. Она снова проходит через контроллер MVC), sessionState пуст. Что может вызвать это/где я могу исправить свою проблему? Пример того, где установлены переменные сеанса, выглядит следующим образом.

.aspx

<asp:UpdatePanel ID="SignaturesUpdatePanel" runat="server"> 
    <ContentTemplate> 
     <div> 
      Signatures for your login are <asp:Literal ID="SignaturesStatusLiteral" runat="server" />.<br /> 
      <asp:LinkButton ID="SignaturesButton" Text="Turn signatures off temporarily" runat="server" OnClick="SignaturesButton_Click" /> 
     </div> 
    </ContentTemplate> 
</asp:UpdatePanel> 

.aspx.cs

protected void SignaturesButton_Click(object sender, EventArgs e) 
{ 
    var signaturesDisabled = Session["SignaturesDisabled"]; 
    bool disabled = signaturesDisabled == null || !bool.Parse(signaturesDisabled.ToString()); 
    Session["SignaturesDisabled"] = disabled; 

    if (disabled) 
    { 
     SignaturesButton.Text = "Turn signatures on"; 
     SignaturesStatusLiteral.Text = "off"; 
    } 
    else 
    { 
     SignaturesButton.Text = "Turn signatures off temporarily"; 
     SignaturesStatusLiteral.Text = "on"; 
    } 
} 

Очевидно до моей работы с помощью контроллера MVC это все работает нормально (т.е. когда это все просто работает как исходное приложение WebForms без участия MVC). Кроме того, в качестве теста я попытался установить переменную сеанса в методе действий контроллера и затем извлечь его в файл .aspx.cs, который работал нормально, поэтому я полагаю, что должно быть что-то, что очищает сеанс, когда он направляется через MVC.

для полноты здесь есть соответствующее отображение маршрута

routes.MapRoute(
    name: "Project File Pages", 
    url: "{page}.aspx", 
    defaults: new { controller = "Legacy", action = "ProjectFileLayout" }, 
    constraints: new { file = new QueryStringConstraint() } 
); 

и (урезана) метод MVC контроллер действий

public ActionResult ProjectFileLayout(int file) 
{ 
    var url = GetCurrentPageUrl(); 
    var sw = new StringWriter(); 
    Server.Execute(url, sw, true); 

    ... 

    var model = new LegacyViewModel 
    { 
     Body = sw.ToString(), 
     ... 
    }; 
    return View(model); 
} 

Если вам нужно больше информации или у меня не было достаточно ясно, в моем вопросе , пожалуйста, дай мне знать!

+0

О да, забыл упомянуть, что я хотел бы оставить исходный код как можно больше - я надеюсь, что смогу исправить эту проблему, установив MVC (или в контроллер и т. Д.) Вместо того, чтобы изменять как работают aspx и связанный код. – Bindi

ответ

0

Изучив еще одну проблему, с которой я столкнулся, я обнаружил, что виноват UpdatePanel. Страница перезагружается из-за updatePanel и из-за маршрутизации, действие контроллера MVC забирает ее. это приводит к повторной визуализации всей страницы, а не только к updatePanel, как это было бы в родных веб-формах.

, чтобы исправить Я собираюсь сделать другое сопоставление маршрута, чтобы собрать вещи, которые имеют соответствующие данные заголовка, а затем просто отправить строку updatePanel, которая будет визуализирована .... надеюсь, вы должны работать чудеса для моих проблем!