ASP.NET MVCは初めてです。ViewModelの目的の理解に問題があります。
ViewModelとは何ですか?なぜASP.NET MVCアプリケーションにViewModelが必要なのですか?
私がその働きと説明についての良い例を手に入れたら、それはより良いでしょう。
ASP.NET MVCは初めてです。ViewModelの目的の理解に問題があります。
ViewModelとは何ですか?なぜASP.NET MVCアプリケーションにViewModelが必要なのですか?
私がその働きと説明についての良い例を手に入れたら、それはより良いでしょう。
回答:
A view model
は、静的テキストまたはデータベースに追加(または編集)できる入力値(テキストボックスやドロップダウンリストなど)に使用されるかどうかに関係なく、ビュー/ページに表示するデータを表します。それはあなたとは違うものdomain model
です。ビューのモデルです。
私たちはあなたが持っているとしましょうEmployee
、あなたの従業員のドメインモデルを表すクラスをし、それは、次のプロパティ(一意の識別子、最初の名前、最後に作成された名前と日付)が含まれています。
public class Employee : IEntity
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateCreated { get; set; }
}
ビューモデルは、ビューで使用するデータ(プロパティで表される)のみを含むという点で、ドメインモデルとは異なります。たとえば、新しい従業員レコードを追加するとします。ビューモデルは次のようになります。
public class CreateEmployeeViewModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
ご覧のとおり、2つのプロパティのみが含まれています。これら2つのプロパティは、従業員ドメインモデルにもあります。これはなぜあなたが尋ねるかもしれませんか? Id
ビューからは設定されない場合があり、従業員テーブルによって自動生成される場合があります。またDateCreated
、ストアドプロシージャまたはアプリケーションのサービスレイヤーで設定される場合もあります。だから、Id
およびDateCreated
ビューモデルで必要とされていません。従業員の詳細(既にキャプチャされている従業員)を静的テキストとして表示するときに、これら2つのプロパティを表示することができます。
ビュー/ページをロードすると、従業員コントローラーのcreateアクションメソッドがこのビューモデルのインスタンスを作成し、必要に応じてフィールドに入力してから、このビューモデルをビュー/ページに渡します。
public class EmployeeController : Controller
{
private readonly IEmployeeService employeeService;
public EmployeeController(IEmployeeService employeeService)
{
this.employeeService = employeeService;
}
public ActionResult Create()
{
CreateEmployeeViewModel model = new CreateEmployeeViewModel();
return View(model);
}
public ActionResult Create(CreateEmployeeViewModel model)
{
// Do what ever needs to be done before adding the employee to the database
}
}
ビュー/ページは次のようになります(使用しているASP.NET MVC
と仮定して、Razor
ビューエンジン):
@model MyProject.Web.ViewModels.CreateEmployeeViewModel
<table>
<tr>
<td><b>First Name:</b></td>
<td>@Html.TextBoxFor(m => m.FirstName, new { maxlength = "50", size = "50" })
@Html.ValidationMessageFor(m => m.FirstName)
</td>
</tr>
<tr>
<td><b>Last Name:</b></td>
<td>@Html.TextBoxFor(m => m.LastName, new { maxlength = "50", size = "50" })
@Html.ValidationMessageFor(m => m.LastName)
</td>
</tr>
</table>
したがって、検証はFirstName
およびでのみ行われLastName
ます。FluentValidationを使用すると、次のような検証が行われる可能性があります。
public class CreateEmployeeViewModelValidator : AbstractValidator<CreateEmployeeViewModel>
{
public CreateEmployeeViewModelValidator()
{
RuleFor(m => m.FirstName)
.NotEmpty()
.WithMessage("First name required")
.Length(1, 50)
.WithMessage("First name must not be greater than 50 characters");
RuleFor(m => m.LastName)
.NotEmpty()
.WithMessage("Last name required")
.Length(1, 50)
.WithMessage("Last name must not be greater than 50 characters");
}
}
データアノテーションを使用すると、次のようになります。
public class CreateEmployeeViewModel : ViewModelBase
{
[Display(Name = "First Name")]
[Required(ErrorMessage = "First name required")]
public string FirstName { get; set; }
[Display(Name = "Last Name")]
[Required(ErrorMessage = "Last name required")]
public string LastName { get; set; }
}
覚えておくべき重要なことは、ビューモデルは、使用したいデータのみを表し、それ以外は何も表さないということです。30個のプロパティを持つドメインモデルがあり、単一の値のみを更新したい場合は、すべての不要なコードと検証を想像できます。このシナリオでは、ドメインモデルにあるすべてのプロパティではなく、ビューモデルにこの1つの値/プロパティのみが含まれます。
ビューモデルには、1つのデータベーステーブルのデータだけが含まれるとは限りません。別のテーブルのデータを組み合わせることができます。上記の私の従業員レコードの追加に関する例を見てみましょう。姓名だけでなく、従業員の部署を追加することもできます。この部門のリストは、Departments
テーブルから取得されます。これで、1つのビューモデルにEmployees
とDepartments
テーブルからのデータがあります。次に、次の2つのプロパティをビューモデルに追加して、データを入力する必要があります。
public int DepartmentId { get; set; }
public IEnumerable<Department> Departments { get; set; }
従業員データ(既にデータベースに追加されている従業員)を編集する場合、上記の例と大差ありません。ビューモデルを作成し、たとえばそれを呼び出しますEditEmployeeViewModel
。このビューモデルで編集したいデータ(姓、名など)のみを含めます。データを編集し、送信ボタンをクリックします。たとえばId
、Id
値はおそらくURLに含まれるため、フィールドについてあまり心配する必要はありません。
http://www.yourwebsite.com/Employee/Edit/3
これId
を取得し、姓名の値とともにリポジトリレイヤーに渡します。
レコードを削除するとき、私は通常、編集ビューモデルと同じパスに従います。たとえば、次のようなURLもあります。
http://www.yourwebsite.com/Employee/Delete/3
ビューが初めて読み込まれるとき、Id
3を使用してデータベースから従業員のデータを取得します。次に、ユーザーがどの従業員が削除されているかを確認できるように、ビュー/ページに静的テキストを表示します。ユーザーが[削除]ボタンをクリックすると、Id
値3を使用してリポジトリレイヤーに渡します。Id
テーブルからレコードを削除する必要があるだけです。
別のポイントとして、実際にはすべてのアクションにビューモデルは必要ありません。単純なデータであれば、のみを使用しても問題ありませんEmployeeViewModel
。複雑なビュー/ページであり、それらが互いに異なる場合は、それぞれに個別のビューモデルを使用することをお勧めします。
これにより、ビューモデルとドメインモデルに関する混乱が解消されることを願っています。
ビューモデルは、特定のビューで使用されるデータモデルを表すクラスです。このクラスをログインページのモデルとして使用できます。
public class LoginPageVM
{
[Required(ErrorMessage = "Are you really trying to login without entering username?")]
[DisplayName("Username/e-mail")]
public string UserName { get; set; }
[Required(ErrorMessage = "Please enter password:)")]
[DisplayName("Password")]
public string Password { get; set; }
[DisplayName("Stay logged in when browser is closed")]
public bool RememberMe { get; set; }
}
このビューモデルを使用して、ビュー(Razorビューエンジン)を定義できます。
@model CamelTrap.Models.ViewModels.LoginPageVM
@using (Html.BeginForm()) {
@Html.EditorFor(m => m);
<input type="submit" value="Save" class="submit" />
}
そしてアクション:
[HttpGet]
public ActionResult LoginPage()
{
return View();
}
[HttpPost]
public ActionResult LoginPage(LoginPageVM model)
{
...code to login user to application...
return View(model);
}
これにより、この結果が生成されます(フォームは送信後、検証メッセージとともに表示されます)。
ご覧のとおり、ビューモデルには多くの役割があります。
LabelFor
、EditorFor
、DisplayFor
ヘルパー)。ビューモデルとその取得の別の例:基本的なユーザーデータ、ユーザーの権限、ユーザー名を表示したいとします。必要なフィールドのみを含む特別なビューモデルを作成します。データベースのさまざまなエンティティからデータを取得しますが、ビューはビューモデルクラスのみを認識します。
public class UserVM {
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public bool IsAdministrator { get; set; }
public string MothersName { get; set; }
}
検索:
var user = db.userRepository.GetUser(id);
var model = new UserVM() {
ID = user.ID,
FirstName = user.FirstName,
LastName = user.LastName,
IsAdministrator = user.Proviledges.IsAdministrator,
MothersName = user.Mother.FirstName + " " + user.Mother.LastName
}
編集:私は私のブログでこの回答を更新しました:
http://www.samwheat.com/post/The-function-of-ViewModels-in-MVC-web-development
私の答えは少し長くなりますが、ビューモデルを他の一般的に使用されるモデルと比較して、なぜ違うのか、なぜ必要なのかを理解することが重要だと思います。
まとめると、尋ねられた質問に直接回答するには:
一般的に、ビューモデルは、ビューのレンダリングに必要なすべてのプロパティとメソッドを含むオブジェクトです。ビューモデルのプロパティは、多くの場合、顧客や注文などのデータオブジェクトに関連し、さらに、ユーザー名、アプリケーション名など、ページまたはアプリケーション自体に関連するプロパティも含みます。ビューモデルは、レンダリングエンジンに渡すのに便利なオブジェクトを提供します。 HTMLページを作成します。ビューモデルを使用する多くの理由の1つは、ビューモデルが、ユーザー入力の処理、データの検証、表示用のデータの取得などの特定のプレゼンテーションタスクを単体テストする方法を提供することです。
エンティティモデル(a.ka. DTOのa.ka.モデル)、プレゼンテーションモデル、およびビューモデルの比較を以下に示します。
データ転送オブジェクト、別名「モデル」
データ転送オブジェクト(DTO)は、データベースのテーブルスキーマに一致するプロパティを持つクラスです。DTOは、データストアとの間でデータを往復する一般的な使用法にちなんで名付けられました。
DTOの特性:
•ビジネスオブジェクト–その定義はアプリケーションデータに依存します。
•通常はプロパティのみが含まれ、コードは含まれません。
•主にデータベースとの間でデータを転送するために使用されます。
•プロパティは、データストア内の特定のテーブルのフィールドと完全またはほぼ一致します。
通常、データベーステーブルは正規化されているため、DTOも通常は正規化されています。これにより、データを表示するための使用が制限されます。ただし、特定の単純なデータ構造では、多くの場合非常にうまく機能します。
DTOがどのように見えるかの2つの例を次に示します。
public class Customer
{
public int ID { get; set; }
public string CustomerName { get; set; }
}
public class Order
{
public int ID { get; set; }
public int CustomerID { get; set; }
public DateTime OrderDate { get; set; }
public Decimal OrderAmount { get; set; }
}
プレゼンテーションモデル
プレゼンテーションモデルは、画面またはレポートにデータをレンダリングするために使用されるユーティリティクラスです。プレゼンテーションモデルは通常、複数のDTOのデータから構成される複雑なデータ構造をモデル化するために使用されます。プレゼンテーションモデルは、多くの場合、データの非正規化されたビューを表します。
プレゼンテーションモデルの特徴:
•ビジネスオブジェクト–その定義はアプリケーションデータに依存します。
•ほとんどのプロパティが含まれています。コードは通常、データのフォーマット、またはDTOとの間の変換に限定されます。プレゼンテーションモデルにはビジネスロジックを含めないでください。
•多くの場合、データの非正規化されたビューが表示されます。つまり、複数のDTOのプロパティを組み合わせることがよくあります。
•多くの場合、DTOとは異なる基本タイプのプロパティが含まれています。たとえば、ドルの金額は文字列として表されるため、カンマと通貨記号を含めることができます。
•多くの場合、それらの使用方法とオブジェクトの特性によって定義されます。つまり、グリッドをレンダリングするためのバッキングモデルとして使用される単純なDTOは、実際にはそのグリッドのコンテキストでのプレゼンテーションモデルでもあります。
プレゼンテーションモデルは、「必要に応じて」および「必要に応じて」使用されます(DTOは通常、データベーススキーマに関連付けられています)。プレゼンテーションモデルは、ページ全体、ページ上のグリッド、またはページ上のグリッドのドロップダウンのデータをモデル化するために使用できます。多くの場合、プレゼンテーションモデルには、他のプレゼンテーションモデルであるプロパティが含まれています。プレゼンテーションモデルは、特定のグリッドを単一のページにレンダリングするなど、使い捨ての目的で作成されることがよくあります。
プレゼンテーションモデルの例:
public class PresentationOrder
{
public int OrderID { get; set; }
public DateTime OrderDate { get; set; }
public string PrettyDate { get { return OrderDate.ToShortDateString(); } }
public string CustomerName { get; set; }
public Decimal OrderAmount { get; set; }
public string PrettyAmount { get { return string.Format("{0:C}", OrderAmount); } }
}
モデルを見る
ビューモデルは、ビューをレンダリングするためのバッキングクラスであるという点でプレゼンテーションモデルに似ています。ただし、プレゼンテーションモデルやDTOとは、その構成方法が大きく異なります。ビューモデルには、プレゼンテーションモデルやDTOと同じプロパティが含まれていることがよくあります。このため、ビューモデルは互いに混同されることがよくあります。
ビューモデルの特性:
•ページまたは画面のレンダリングに使用される単一のデータソースです。通常、これは、ビューモデルが、ページ上の任意のコントロールがそれ自体を正しくレンダリングするために必要とするすべてのプロパティを公開することを意味します。ビューモデルをビューの単一のデータソースにすると、ユニットテストの機能と価値が大幅に向上します。
• アプリケーションデータで構成されるプロパティと、アプリケーションコードで使用されるプロパティを含む複合オブジェクトです。この特性は、再利用可能なビューモデルを設計する際に重要であり、以下の例で説明します。
•アプリケーションコードが含まれています。通常、ビューモデルには、レンダリング中、およびユーザーがページを操作しているときに呼び出されるメソッドが含まれています。このコードは通常、イベント処理、アニメーション、コントロールの可視性、スタイリングなどに関連しています。
•データの取得またはデータベースサーバーへの送信を目的としてビジネスサービスを呼び出すコードが含まれています。このコードは、誤ってコントローラーに配置されることがよくあります。コントローラからビジネスサービスを呼び出すと、通常、ユニットテストのビューモデルの有用性が制限されます。明確にするために、ビューモデル自体にはビジネスロジックを含めないでください。ビジネスロジックを含むサービスを呼び出す必要があります。
•多くの場合、他のページまたは画面の他のビューモデルであるプロパティが含まれています。
•「ページごと」または「画面ごと」と書かれている。固有のビューモデルは、通常、アプリケーションのすべてのページまたは画面に対して作成されます。
•ほとんどのページと画面は共通のプロパティを共有するため、通常は基本クラスから派生します。
モデル構成を表示
前述のように、ビューモデルは、アプリケーションプロパティとビジネスデータプロパティを1つのオブジェクトに結合するという点で、複合オブジェクトです。ビューモデルで使用される一般的に使用されるアプリケーションプロパティの例は次のとおりです。
•エラーメッセージ、ユーザー名、ステータスなど、アプリケーションの状態を表示するために使用されるプロパティ
•コントロールのフォーマット、表示、スタイル設定、またはアニメーション化に使用されるプロパティ。
•リストオブジェクトやユーザーが入力した中間データを保持するプロパティなど、データバインディングに使用されるプロパティ。
次の例は、ビューモデルの複合的な性質が重要である理由と、効率的で再利用可能なビューモデルを最適に構築する方法を示しています。
Webアプリケーションを作成していると仮定します。アプリケーション設計の要件の1つは、ページタイトル、ユーザー名、およびアプリケーション名をすべてのページに表示する必要があることです。プレゼンテーション注文オブジェクトを表示するページを作成する場合は、プレゼンテーションモデルを次のように変更します。
public class PresentationOrder
{
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
public int OrderID { get; set; }
public DateTime OrderDate { get; set; }
public string PrettyDate { get { return OrderDate.ToShortDateString(); } }
public string CustomerName { get; set; }
public Decimal OrderAmount { get; set; }
public string PrettyAmount { get { return string.Format("{0:C}", OrderAmount); } }
}
このデザインはうまくいくかもしれませんが、注文のリストを表示するページを作成したい場合はどうでしょうか?PageTitle、UserName、およびApplicationNameの各プロパティは繰り返され、扱いにくくなります。また、クラスのコンストラクターでページレベルのロジックを定義したい場合はどうなりますか?表示されるすべての注文のインスタンスを作成すると、それを行うことができなくなります。
継承より構成
以下は、本当のビューモデルになるように注文プレゼンテーションモデルをリファクタリングする方法であり、単一のPresentationOrderオブジェクトまたはPresentationOrderオブジェクトのコレクションを表示するのに役立ちます。
public class PresentationOrderVM
{
// Application properties
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
// Business properties
public PresentationOrder Order { get; set; }
}
public class PresentationOrderVM
{
// Application properties
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
// Business properties
public List<PresentationOrder> Orders { get; set; }
}
上記の2つのクラスを見ると、ビューモデルを考える1つの方法は、プロパティとして別のプレゼンテーションモデルを含むプレゼンテーションモデルであることがわかります。最上位のプレゼンテーションモデル(ビューモデル)には、ページまたはアプリケーションに関連するプロパティが含まれ、プレゼンテーションモデル(プロパティ)には、アプリケーションデータに関連するプロパティが含まれます。
デザインを一歩進めて、PresentationOrdersだけでなく、他のクラスにも使用できるベースビューモデルクラスを作成できます。
public class BaseViewModel
{
// Application properties
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
}
これで、PresentationOrderVMを次のように簡略化できます。
public class PresentationOrderVM : BaseViewModel
{
// Business properties
public PresentationOrder Order { get; set; }
}
public class PresentationOrderVM : BaseViewModel
{
// Business properties
public List<PresentationOrder> Orders { get; set; }
}
BaseViewModelをジェネリックにすることで、さらに再利用可能にすることができます。
public class BaseViewModel<T>
{
// Application properties
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
// Business property
public T BusinessObject { get; set; }
}
今、私たちの実装は簡単です:
public class PresentationOrderVM : BaseViewModel<PresentationOrder>
{
// done!
}
public class PresentationOrderVM : BaseViewModel<List<PresentationOrder>>
{
// done!
}
MyViewModel<MyPresModel>
MVCにはビューモデルがありません。モデル、ビュー、コントローラーがあります。viewmodelはMVVM(Model-View-Viewmodel)の一部です。MVVMはプレゼンテーションモデルから派生し、WPFで普及しています。MVVMにもモデルがあるはずですが、ほとんどの人はそのパターンの要点を完全に逃し、ビューとビューモデルしかありません。MVCのモデルは、MVVMのモデルに似ています。
MVCでは、プロセスは3つの異なる責任に分けられます。
MVCはWebアプリケーションにはあまり適していません。これは、Smalltalkがデスクトップアプリケーションを作成するために導入したパターンです。Web環境の動作は完全に異なります。40年前のコンセプトをデスクトップ開発からコピーしてWeb環境に貼り付けるのはあまり意味がありません。ただし、多くの人は、アプリケーションがコンパイルして正しい値を返すため、これは問題ないと考えています。つまり、私の意見では、特定のデザインの選択をOKと宣言するには不十分です。
Webアプリケーションのモデルの例は次のとおりです。
public class LoginModel
{
private readonly AuthenticationService authentication;
public LoginModel(AuthenticationService authentication)
{
this.authentication = authentication;
}
public bool Login()
{
return authentication.Login(Username, Password);
}
public string Username { get; set; }
public string Password { get; set; }
}
コントローラは次のように使用できます:
public class LoginController
{
[HttpPost]
public ActionResult Login(LoginModel model)
{
bool success = model.Login();
if (success)
{
return new RedirectResult("/dashboard");
}
else
{
TempData["message"] = "Invalid username and/or password";
return new RedirectResult("/login");
}
}
}
コントローラーのメソッドとモデルは小さく、簡単にテストでき、要点がわかります。
ビューモデルaは、複数のクラスプロパティを含むことができる単純なクラスです。これを使用して、必要なすべてのプロパティを継承します。たとえば、2つのクラスStudentとSubjectがあります。
Public class Student
{
public int Id {get; set;}
public string Name {get; set;}
}
Public class Subject
{
public int SubjectID {get; set;}
public string SubjectName {get; set;}
}
ここで、ビューに(MVCで)生徒の名前と被験者の名前のレコードを表示したいのですが、次のような複数のクラスを追加することはできません。
@model ProjectName.Model.Student
@model ProjectName.Model.Subject
上記のコードはエラーをスローします...
これで、1つのクラスを作成して任意の名前を付けることができますが、この形式 "XyzViewModel"を使用すると理解しやすくなります。継承の概念です。次に、次の名前の3番目のクラスを作成します。
public class StudentViewModel:Subject
{
public int ID {get; set;}
public string Name {get; set;}
}
次に、このViewModelをViewで使用します
@model ProjectName.Model.StudentViewModel
これで、ViewのStudentViewModelと継承されたクラスのすべてのプロパティにアクセスできます。
大きな例がたくさんありますが、はっきりとクリスピーな方法で説明させてください。
ViewModel =ビューを提供するために作成されるモデル。
ASP.NET MVCビューに複数のモデルを含めることはできないため、複数のモデルのプロパティをビューに表示する必要がある場合は不可能です。ViewModelはこの目的を果たします。
ビューモデルは、ビューに必要なプロパティのみを保持できるモデルクラスです。データベースの複数のエンティティ(テーブル)のプロパティを含めることもできます。名前が示すように、このモデルはビューの要件に固有に作成されます。
ビューモデルのいくつかの例を以下に示します
ViewModelは、複数のエンティティへのレコードの挿入、更新にも使用できますが、ViewModelの主な用途は、複数のエンティティ(モデル)の列を単一のビューに表示することです。
ViewModelの作成方法は、モデルの作成と同じです。Viewmodelのビューを作成する方法は、Modelのビューを作成する方法と同じです。
以下は、ViewModelを使用したListデータの小さな例です。
これが役立つことを願っています。
ビューモデルは、データの概念モデルです。その使用は、たとえば、サブセットを取得するか、異なるテーブルからデータを結合することです。
特定のプロパティのみが必要な場合があるので、これにより、それらをロードすることのみが可能になり、不要な追加のプロパティはロードできません
ViewModelの設計
public class UserLoginViewModel
{
[Required(ErrorMessage = "Please enter your username")]
[Display(Name = "User Name")]
[MaxLength(50)]
public string UserName { get; set; }
[Required(ErrorMessage = "Please enter your password")]
[Display(Name = "Password")]
[MaxLength(50)]
public string Password { get; set; }
}
ビューでのビューモデルの提示
@model MyModels.UserLoginViewModel
@{
ViewBag.Title = "User Login";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@using (Html.BeginForm())
{
<div class="editor-label">
@Html.LabelFor(m => m.UserName)
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.UserName)
@Html.ValidationMessageFor(m => m.UserName)
</div>
<div class="editor-label">
@Html.LabelFor(m => m.Password)
</div>
<div class="editor-field">
@Html.PasswordFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)
</div>
<p>
<input type="submit" value="Log In" />
</p>
</div>
}
アクションでの作業
public ActionResult Login()
{
return View();
}
[HttpPost]
public ActionResult Login(UserLoginViewModel user)
{
// To acces data using LINQ
DataClassesDataContext mobjentity = new DataClassesDataContext();
if (ModelState.IsValid)
{
try
{
var q = mobjentity.tblUsers.Where(m => m.UserName == user.UserName && m.Password == user.Password).ToList();
if (q.Count > 0)
{
return RedirectToAction("MyAccount");
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
catch (Exception ex)
{
}
}
return View(user);
}
ビューモデルは、ビューにデータをレンダリングするために使用できるクラスです。2つのエンティティPlaceとPlaceCategoryがあり、単一のモデルを使用して両方のエンティティのデータにアクセスする場合は、ViewModelを使用します。
public class Place
{
public int PlaceId { get; set; }
public string PlaceName { get; set; }
public string Latitude { get; set; }
public string Longitude { get; set; }
public string BestTime { get; set; }
}
public class Category
{
public int ID { get; set; }
public int? PlaceId { get; set; }
public string PlaceCategoryName { get; set; }
public string PlaceCategoryType { get; set; }
}
public class PlaceCategoryviewModel
{
public string PlaceName { get; set; }
public string BestTime { get; set; }
public string PlaceCategoryName { get; set; }
public string PlaceCategoryType { get; set; }
}
したがって、上記の例では、PlaceとCategoryは2つの異なるエンティティであり、PlaceCategory viewmodelはViewで使用できるViewModelです。
ViewModelsで「ベースライン」Webアプリケーションをセットアップする方法をコードで学習したい場合は、このコードをGitHubでダウンロードすることをお勧めします:https : //github.com/ajsaulsberry/BlipAjax。大規模なエンタープライズアプリケーションを開発しました。これを行うと、このすべての「ViewModel」機能を処理する適切なアーキテクチャをセットアップすることが問題になります。BlipAjaxを使用すると、最初に非常に優れた「ベースライン」が得られると思います。その単純なウェブサイトですが、そのシンプルさは素晴らしいです。私は、アプリケーションで本当に必要なものを指摘するために彼らが英語を使用した方法が好きです。