MVC с использованием веб-форм ASP.NET

Я унаследовал приложение ASP.NET, построенное на основе веб-форм, и приложение страдает от того, что вся его бизнес-логика встроена в код. В результате это приложение не может быть проверено модулем.

Я хочу разбить функциональность каждой формы на стиль MVC, но я обнаружил, что ASP.NET сопротивляется всем моим усилиям по ее рефакторингу. В общем, я люблю разделять свои классы MVC следующим образом:


public class LoginModel
{
    public string Username, Password;
    public bool IsAuthenticated;
}

public interface ILoginView
{
    event Action UserLoggedIn;
    void SetMode(bool isAuthenticated);
}

public class LoginController
{
    ILoginView View;
    LoginModel Model;

    public LoginController(ILoginView view, LoginModel model)
    {
        this.View = view;
        this.Model = model;

        // hook onto view events
    }
}

После того, как мои классы настроены и хорошо протестированы, я могу реализовать ILoginViewинтерфейс на своем пользовательском контроле или странице:


public class LoginView : UserControl, ILoginView
{
    public LoginView() : base()
    {
        new LoginController(this); // registers view with the controller
    }
}

Если бы это было приложение winform, оно бы работало красиво. Но жизненный цикл ASP.NET приводит к нарушению этого стиля.

  • ASP.NET создает и уничтожает представление при каждой загрузке страницы. Поскольку мой контроллер удерживается представлением, модель удерживается контроллером, при каждой обратной передаче моя страница теряет свое состояние.

  • Я могу устранить вышеуказанную проблему, удерживая мой контроллер в сеансе пользователей, но это создает массу проблем. В частности, помещение контроллеров в сеанс вызывает проблемы с памятью, поскольку модели и контроллеры не возвращаются при сборке мусора до истечения сеанса. Переход от страницы к странице создает десятки контроллеров, но контроллеры не избавляются от себя, когда пользователь уходит со страницы.

  • Так как представление уничтожается / воссоздается при каждой обратной передаче, я должен заново регистрировать представление в контроллере при каждой обратной передаче. Это сложнее, чем кажется, потому что состояние модели нужно копировать обратно в представление при каждой обратной передаче, но одновременно мы не хотим перезаписывать изменения пользователя в представлении, которые были сделаны в предыдущей обратной передаче. Вы не представляете, к какому дополнительному кошмару это приводит при работе с динамически создаваемыми или AJAXed-элементами управления, использующими этот стиль MVC.

Я знаю, что обдумываю это, и есть более простой способ получить желаемые результаты, но как правильно реализовать стиль MVC с помощью веб-форм?

10.12.2008 16:06:37
Если вам нужно придерживаться DNN, я бы сказал, что лучше всего придерживаться реализации веб-форм и просто очистить свою бизнес-логику от кода, стоящего за этим. MVC делает то, что делает хорошо, но, как вы выяснили, пытаться смешивать модели сложно. Веб-формы не плохие, они просто отличаются от MVC. Охватите благость веб-форм.
Nick DeVore 4.02.2010 18:27:59
4 ОТВЕТА

Не проще ли переписать это с помощью asp.net mvc?

1
10.12.2008 16:15:05
Нет, проект основан на DotNetNuke, поэтому он несовместим с ASP.NET MVC.
Juliet 10.12.2008 16:27:43

Как кажется, вам придется переписать. Либо полностью в MVC (и прекратите использовать DNN), либо в лучшую реализацию WebForms (то есть отделите логику от отображения и учтите проблемы жизненного цикла страницы). Есть третий вариант - объединение веб-форм MVC и ASP.NET, но вы должны внимательно изучить его, принимая во внимание все переменные в вашей платформе.

1
12.07.2009 15:35:25

Ну, природа POSTback диктует изменения вашего состояния, так что вы должны реагировать на это. Любой используемый вами фреймворк будет работать примерно так же, он будет перестраивать / связывать состояние с каждым запросом. Вы должны посмотреть в savind состояние (чтение данных) в сеансе вашего пользователя.

0
12.07.2009 16:24:46

ViewState следует использовать для хранения всех загруженных данных в WebForms, поэтому экземпляр Controller будет создаваться только при создании страницы, что исключает необходимость сохранения какого-либо объекта в пользовательском сеансе.

0
4.02.2010 18:23:21