Сравнение Asp.net (MVC) и WPF (MVVM) — существует ли эквивалент привязки данных?

Я рассматриваю переходную форму WPF (mvvm) на asp.net (MVC). Я подумал, что было бы полезно для здравомыслия провести сравнение asp.net(MVC) и WPF(MVVM).

Как будет выглядеть MVC-эквивалент следующего примера WPF? Чтобы быть конкретным, мне любопытно, как поддерживается разделение пользовательского интерфейса и логики приложения и, что, возможно, более важно, существует ли эквивалент привязки данных. Как два разных шаблона проектирования выполнят один и тот же сценарий.

Модель просмотра

В вашей модели представления у вас будет класс, в котором компонент в представлении также будет привязан. Что-то на мелодию:

namespace solution.ViewModels
{
    public class MainViewModel : BaseViewModel
    {
        private DateTime _fromDate;

        public DateTime FromDate
        {
            get { return _fromDate; }
            set { _fromDate = value; OnPropertyChanged("FromDate"); }
        }

        private DateTime _toDate;

        public DateTime ToDate
        {
            get { return _toDate; }
            set { _toDate = value; OnPropertyChanged("ToDate");}
        }
    }
}

Где BaseViewModel:

public class BaseViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Просмотреть

<Window .......>
    <Grid>
       <DatePicker SelectedDate = "{Binding ToDate}">
       <DatePicker SelectedDate = "{Binding FromDate}">
    </Grid>
</Window>

person LCaraway    schedule 15.02.2017    source источник
comment
Сравнение веб-приложения MVC с настольным приложением WPF похоже на сравнение яблок с автомобилями. Не делайте ошибку, пытаясь портировать его. Забудьте о том, что вы сделали до сих пор, и начните с нуля.   -  person Peter Bons    schedule 16.02.2017
comment
Это справедливо, и в конечном счете то, что я имел в виду. Все еще надеялся начать дискуссию о том, как разные шаблоны дизайна достигают одних и тех же целей.   -  person LCaraway    schedule 16.02.2017
comment
Я бы посоветовал вам взглянуть на knockoutjs.com. Это платформа для разработки пользовательского интерфейса Javascript с использованием шаблона MVVM.   -  person Martino Bordin    schedule 16.02.2017
comment
Я делаю и то, и другое, и единственное сходство между этими двумя шаблонами заключается в том, что на веб-странице, которая в значительной степени зависит от запросов ajax для обработки действий, которые пользователь делает в пользовательском интерфейсе, очень полезно использовать javascript MVVM, такой как Knockoutjs, как упоминал @MartinoBordin . Они позаботятся обо всех этих неудобных обновлениях пользовательского интерфейса ‹--› javascript, как это делают Bindings в WPF.   -  person    schedule 16.02.2017


Ответы (2)


Я думаю, что некоторые комментарии по этому вопросу до сих пор немного несправедливы... Да, две технологии (ASP.Net MVC и WPF) используются для создания совершенно разных платформ, но есть сравнения, которые можно провести между архитектурами. (MVC и MVVM), используемые на каждой из этих платформ.

В WPF у вас есть ViewModel, который предоставляет вашу Model вашему View. В вашем примере MainViewModel предоставляет модель, которая содержит дату начала и окончания через свойства FromDate и ToDate. Затем представление может отображать эти значения по своему усмотрению.

В ASP.Net MVC у вас по-прежнему есть модель и представление, а также то, что их соединяет — контроллер. Действие, вызываемое на вашем контроллере некоторым HTTP-запросом, отвечает за заполнение модели, которая будет отображаться представлением и возвращаться клиенту в качестве HTTP-ответа.

public class MainController : Controller
{
  public ActionResult ShowMeTheModel()
  {
    SimpleModel model = new SimpleModel
    {
      FromDate = DateTime.Today,
      ToDate = DateTime.Today.AddDays(7)
    };

    return View(model);
  }

  [HttpPost]
  public ActionResult UpdateTheModel(SimpleModel model)
  {
    // use the model parameter to persist changes or otherwise        

    return Redirect("ShowMeAllTheModels");
  }
}

И основной вид

<h2>A Simple Model</h2>

<% using(Html.BeginForm("UpdateTheModel", "Main")) %>
<% { %>

  <table>
    <tr>
      <th>From Date</th>
      <th>To Date</th>
    </tr>
    <tr>
      <td>
        <%= Html.DatePickerFor(model => model.FromDate) %>
      </td>
      <td>
        <%= Html.DatePickerFor(model => model.ToDate) %>
      </td>
    </tr>
  </table>
<% } %>

Привязка данных происходит в обратном сообщении — проще говоря, действие [HttpPost] с параметром типа SimpleModel заполнит эту модель значениями, содержащимися в сообщении HTTP. Затем это действие может использовать эти значения в этой модели, чтобы сохранить изменения или инициировать какое-либо действие.

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

person Simon Fox    schedule 15.02.2017
comment
Спасибо, Саймон, что нашли время провести сравнение. Определенно помогает мне понять MVC с точки зрения WPF/MVVM. - person LCaraway; 16.02.2017
comment
Это неполное. Среды MVVM на стороне клиента распространены для приложений, которые используют ajax больше, чем обратные передачи. Вы просто освещаете серверную часть (что важно, но все же...). - person ; 16.02.2017

Нет, нет, нет и... НЕТ

WPF запускается на стороне клиента, и все происходит на стороне клиента. Он хранит все состояния и данные в памяти одной и той же машины.

MVC, с другой стороны, работает как на стороне клиента, так и на стороне сервера, где сервер НЕ хранит состояние (вы можете прочитать больше о HTTP без сохранения состояния), а клиент/сервер не использует одну и ту же часть памяти или данных.

Так что это совершенно разные технологии, предназначенные для совершенно разных вариантов использования.

С другой стороны, классический ASP пытается имитировать описанное вами поведение с помощью обратной отправки. По сути, он отправляет все действия пользователя обратно на сервер, и сервер может действовать соответствующим образом (например, изменить значение, отключить кнопку и т. Д.).

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

person Steve    schedule 15.02.2017
comment
Хорошо, спасибо, Стив. Я ценю вклад. Все еще многому этому учусь. Не был уверен, есть ли способ mvc инициализировать модель в контроллере, установить значения, а затем передать любые значения в представление. Затем вернитесь в другую сторону, когда что-то изменится в представлении. Похоже, я буду много писать на JavaScript. - person LCaraway; 16.02.2017
comment
если серверу необходимо знать, когда выбор пользователя изменился, прежде чем пользователь нажмет кнопку «Отправить», то, скорее всего, вы делаете это неправильно. В некоторых случаях это допустимо (например, вы хотите загружать что-то только тогда, когда это запрошено), в этом случае вы можете изучить вызовы API. Но помните о природе HTTP без сохранения состояния. - person Steve; 16.02.2017
comment
@steve, если вам нужен SPA в реальном времени, вы можете использовать mvvm, модель просмотра на сервере и представление с html и Javascript. Для этого есть рамки. - person Luis; 22.04.2018