Возможно / жизнеспособно MVVM в приложении DHTML RIA (без Silverlight / WPF)? - PullRequest
17 голосов
/ 15 июля 2009

Примечание. Это длинный вопрос, требующий хорошего понимания «шаблона проектирования» MVSM, JSON и jQuery ....

Итак, у меня есть теория / утверждение, что MVVM в DHTML возможен и жизнеспособен и хочу знать, согласны ли вы со мной или нет и почему. Реализация MVVM в DHTML вращается вокруг использования ajax-вызовов к объекту сервера, который возвращает JSON, и затем использования html-манипуляции через javascript для управления html.

Так, чтобы сломать это. Допустим, я создаю страницу поиска, которая ищет людей в базе данных .....

View будет выглядеть примерно так:

    
        <body <strong>viewmodel="SearchViewModel"</strong>>
            Search:<br />
            <input type="text" <strong>bindto="SearchString"</strong> /><br />
            <input type="button" value="Search" <strong>command="Search"</strong> />
            <br />
            <table <strong>bindto="SearchResults"</strong>>
                <thead>
                    <tr>
                        <th>First Name</th>
                        <th>Last Name</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>${FirstName}</td>
                        <td>${LastName}</td>
                    </tr>
                </tbody>
            </table>
        </body>
    

Используя некоторые нестандартные атрибуты в моих html-элементах, я определенным образом определил View и то, как он будет взаимодействовать с моей ViewModel . Я создал синтаксический анализатор MVVM в javascript , который интерпретирует нестандартные атрибуты и связывает представление с объектом JSON, представляющим модель представления.

ViewModel будет объектом JSON:

    
        //View Model SearchViewModel would be assocaited with View because of <body <strong>viewmodel="SearchViewModel"</strong>>
        var SearchViewModel = {
            //SearchString variable has a TwoWay binding 
            //to <input type="text" <strong>bindto="SearchString"</strong> /><
            //if a user types into the text box, the SearchString property will "auto-magically" be updated
            //because of the two way binding and how the element was interpreted via my <strong>MVVM parser</strong>
            SearchString: '',

            //SearchResults has a OneWay binding to <table <strong>bindto="SearchResults"</strong>>
            SearchResults: new Array(), 

            //Search function will get "auto-magically" get called because of 
            //the command binding to <input type="button" <strong>command="Search"</strong> />
            Search: function() {
               //using jquery to call into the server asynchronously
               //when the server call is completed, the PopulateSearchResults method will be called
               $.getJSON("www.example.com/SearchForPerson",
                         { searchString: SearchViewModel.SearchString },
                         SearchViewModel.PopulateSearchResults);
            }

            PopulateSearchResults: function(data) {
                //set the JSON array
                SearchViewModel.SearchResults = data;
                //<strong>simulate INotifyPropertyChanged using the MVVM parser</strong>
                mvvmParser.notifyPropertyChanged("SearchResults");
            }
        }
    

Модель может быть любым ресурсом на стороне сервера, который возвращает JSON ... в этом примере я использовал asp MVC в качестве успокаивающего фасада:

    
        public JsonResult SearchForPerson(string searchString)
        {
            PersonDataContext personDataContext = new PersonDataContext(); //linq to sql.....

            //search for person
            List<Person> results = 
                personDataContext.Persons
                                 .Where(p => p.FirstName.Contains(searchString)
                                             || p.LastName.Contains(searchString))
                                 .ToList();

            return Json(results);
        }
    

Итак, опять вопрос:
Возможно ли / жизнеспособно MVVM в приложении DHTML RIA (без Silverlight / WPF) или я сошел с ума?

Может быть, эта "среда MVVM" будет хорошей идеей?

Подтверждение концепции: kaboom.codeplex.com .

Ответы [ 4 ]

10 голосов
/ 09 января 2011

Вероятно, сейчас самое время связать с knockout JS , который является фреймворком javascript mvvm.

Возможно, вы также захотите взглянуть на магистраль , структуру JavaScript MVC:

3 голосов
/ 15 июля 2009

Взгляните на функции связывания данных ASP.NET в .NET 4.0 - поставляется с Visual Studio 2010. Это именно то, что вам нужно, если вы знакомы с технологией MS.

Блог, в котором подробно описана функция

Предварительный просмотр технологии сообщества на codeplex

Теоретически вы можете просто включить файл ASP.NET AJAX js из ваших файлов HTML и сделать решение кроссплатформенным.

Так что прямо ответить на ваш вопрос - это абсолютно жизнеспособное решение проблемы создания поддерживаемых, слабо связанных веб-интерфейсов пользователя. И да, серверная сторона вашего приложения делает меньше - это становится скорее настоящим сервисным уровнем, где все, с чем оно имеет дело, это обмен данными. На самом деле это хорошая вещь, потому что она способствует повторному использованию среди клиентов. Представьте, что ваше приложение WPF и ваше веб-приложение используют один и тот же сервер среднего уровня для отправки / получения данных? Клиенты в любом случае имеют много доступной вычислительной мощности - почему бы не использовать ее, чтобы сделать ваше решение более масштабируемым (чем меньше сервер делает, тем больше работа ваших клиентов, которая распределена по ВСЕМ клиентам)

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

Похоже, что Microsoft - единственная компания, которая в настоящее время создает полное решение по желаемому шаблону. Библиотека YUI в Yahoo выполняет связывание данных, которое является полусвязным, но не совпадает с шаблоном WPF / Silverlight, как вы создали.

1 голос
/ 09 декабря 2010

Я использую аналогичную концепцию и добавил JQuery Templating & DataLink (http://weblogs.asp.net/scottgu/archive/2010/10/04/jquery-templates-data-link-and-globalization-accepted-as-official-jquery-plugins.aspx) к уравнению как способ получить чистые представления и декларативное связывание (связывающая часть доставляет мне некоторые проблемы, но я думаю, что она может работать нормально) ).

Использование этого в сценарии, где я должен использовать службы асинхронно, и мне действительно это нравится.

Мне интересно, как выглядит ваш MVVM Parser, я использовал паб / подплагин для связи.

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

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

По моему мнению, вы все еще намного лучше используете архитектуру MVC на стороне сервера, чем пытаетесь создать инфраструктуру MVVM на стороне клиента.

...