2017-02-15 33 views
1

WPF(mvvm)からasp.net(MVC)への移行を検討しています。私はそれがasp.net(MVC)とWPF(MVVM)の比較を失うことを正気のために役立つかもしれないと思った。Asp.net(MVC)とWPF(MVVM)の比較 - データバインディングは同等ですか?

次のWPFの例のMVCに相当するものは何ですか?具体的には、UIとアプリケーションロジックの分離がどのように維持されているか、おそらくより重要なのは、データバインディングに相当するものがあるかどうか不思議です。どのように2つの異なるデザインパターンが同じシナリオを達成するのでしょうか?

のViewModel

ビューモデルでは、あなたは、ビュー内のコンポーネントがあまりにもバインドするには、クラスを持っているでしょう。

BaseViewModelがある
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");} 
     } 
    } 
} 

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> 
+2

MVC WebアプリケーションとWPFデスクトップアプリケーションを比較することは、リンゴと車を比較するのと同じです。それを移植しようと間違ってはいけません。あなたがこれまでにやったことを忘れ、最初から始めましょう。 –

+0

それは公正で、最終的には私が心に留めていたことです。さまざまなデザインパターンが同じ目標をどのように達成するかについての議論を開始したいと考えていました。 – LCaraway

+3

http://knockoutjs.comをご覧になることをお勧めします。MVVMパターンを使用してJavascript UIを開発するためのフレームワークです。 –

答えて

5

に不要な圧力をたくさん入れているので、私はこの質問のコメントのいくつかは、これまで少し不公平...はい二つの技術(ASPいると思うもうそれを使用してお勧めしません.Net MVCとWPF)は完全に異なるプラットフォーム用に構築されていますが、各プラットフォームで使用されているアーキテクチャ(MVCとMVVM)の間で比較ができます。 WPFでは

あなたビューにごモデルを公開ViewModelにを持っています。あなたの例では、MainViewModelは、fromとaを含むモデルをFromDateToDateプロパティで公開しています。ビューは、その値を表示するように選択できます。 コントローラ - ASP.Net MVCで

は、あなたはまだ2を接続 モデルビューと何かを持っています。 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> 
<% } %> 

データバインディングは、ポストバックで発生する基本的なビュー - 非常に簡単に言えば、HTTPポストに含まれる値とそのモデルを移入しますタイプSimpleModelのパラメータを持つ[HttpPost]アクション。そのアクションは、そのモデル内のその値を使用して、変更を保持したり、何らかのアクションをトリガーしたりすることができます。

プラットフォームが非常に異なり、これらの違いを完全に理解する必要がありますが、上記で概説したように間違いなく比較が可能です。

+2

Simonに時間を割いて比較していただきありがとうございます。間違いなく、WPF/MVVMの観点からMVCを理解するのに役立ちます。 – LCaraway

+1

これは不完全です。ポストバック以上のajaxを利用するアプリケーションでは、クライアント側のMVVMフレームワークが一般的です。あなたはサーバー側をカバーしています(これは重要ですが、まだ...)。 – Will

2

いや、いや、いやと... NO

WPFがされての曲に何かクライアント側で実行され、クライアント側ですべてが起こっています。すべての状態とデータを同じマシンのメモリに保持します。

MVCは、サーバーが状態を保存しないクライアント側とサーバー側の両方で実行されます(HTTPステートレスについて詳しく読むことができます)。クライアント/サーバーは同じメモリまたはデータを共有しません。

これらは完全に異なるユースケースを対象とした全く異なる技術です。

従来のASPでは、バックポストを使用して記述した動作をシミュレートしようとしています。基本的には、すべてのユーザーのアクションをサーバーに送り返し、サーバーはそれに対応して動作することができます(値の変更、ボタンの使用不可など)。

それがサーバー

+0

OK、ありがとう、スティーブ。私は入力を感謝します。まだ多くのことを学んでいます。コントローラにモデルを初期化し、値を設定してから、ビューに何らかの値を渡すというmvcの方法があるかどうかは不明でした。次に、ビューで何かが変更されたら、もう一方の方法に戻ります。私は多くのJavaScriptをやっているように思えます。 – LCaraway

+0

ユーザーが送信を開始する前にユーザーの選択がいつ変更されたかをサーバーが認識しなければならない場合は、間違っている可能性があります。これが有効なケースがいくつかあるかもしれません(たとえば、リクエストされたときにのみロードしたい場合など)。その場合、API呼び出しを調べることができます。しかし、HTTPの無国籍性を覚えておいてください – Steve

関連する問題