MVC с использованием веб-форм ASP.NET - PullRequest
2 голосов
/ 10 декабря 2008

Я унаследовал приложение 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 с помощью веб-форм?

Ответы [ 4 ]

1 голос
/ 12 июля 2009

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

1 голос
/ 10 декабря 2008

Не проще ли переписать это, используя asp.net mvc?

0 голосов
/ 04 февраля 2010

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

0 голосов
/ 12 июля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...