0

私はまだこのMVCのことに慣れていないので、MVCビューモデルに関して私の理解は正しいです。それらは基本的にビューと直接やり取りするモデルですが、通常のモデルはビューとやり取りする場合としない場合があります。したがって、UserModel と ArticleModel の 2 つのクラスがあります。すべてのユーザー情報を表示する最良の方法と、記事の 1 つの説明を表示するには、このためのビュー モデルを作成しますか? UserModel と ArticleModel のインスタンスを返すビューモデルを作成するだけですか、それとももっと良い方法がありますか?

私の現在のクラス:

public class UserModel
{
    public int UserId { get; set; }
    public String FirstName { get; set; }
    public String LastName { get; set; }
    public DateTime CreatedDate { get; set; }
}

public class ArticleModel
{
    public int ArticleId { get; set; }
    public String Title { get; set; }
    public String Description { get; set; }
    public DateTime AddDate { get; set; }
}
4

5 に答える 5

2

一般に、ビューモデルを使用することをお勧めします。それらを使用する利点はいくつかあります。ビューモデルの詳細の多くは、インターネットやスタックオーバーフローでも見つけることができると思います。
したがって、例または出発点を挙げ
ましょう。ビューモデルがあるとしましょう。

public class CategoryViewModel
{
    [Key]
    public int CategoryId { get; set; }
    [Required(ErrorMessage="* required")]
    [Display(Name="Name")]
    public string CategoryName { get; set; }
    [Display(Name = "Description")]
    public string CategoryDescription { get; set; }
    public ICollection<SubCategory> SubCategories { get; set; }
}

これをリポジトリ プロジェクトで使用する場合は、次のようにします。このようなことができます。

public List<CategoryViewModel> GetAllCategories()
{
    using (var db =new Entities())
    {
        var categoriesList = db .Categories
            .Select(c => new CategoryViewModel()
            {
                CategoryId = c.CategoryId,
                CategoryName = c.Name,
                CategoryDescription = c.Description
            });
        return categoriesList.ToList<CategoryViewModel>();
    };
 }

ご覧のように。ビューモデルの場合、プロジェクションを使用する必要があります(エンティティをビューモデルに投影したため)。
これで、コントローラーで簡単にアクセスしてビュー自体に渡すことができます。

ICategoryRepository _catRepo;
    public CategoryController(ICategoryRepository catRepo)
    {
        //note that i have also used the dependancy injection. so i'm skiping that
        _catRepo = catRepo;
    }
    public ActionResult Index()
    {
        //ViewBag.CategoriesList = _catRepo.GetAllCategories();
           or
        return View(_catRepo.GetAllCategories());
    }

そして今、あなたのビューはタイプCategoryViewModel(強く型付けされたもの)でなければなりません

@model IEnumerable<CategoryViewModel>
@foreach (var item in Model)
{
    <h1>@item.CategoryName</h1>
}

これが出発点になることを願っています。私からもっと必要な場合はお知らせください:D

于 2013-03-15T15:22:19.587 に答える
2

従うべきいくつかのルールとベストプラクティス:--

  • すべてのビューは厳密に型指定されています
  • ViewModel タイプごとに、厳密に型指定されたビューが 1 つだけ定義されています。
  • View は、ViewModel の設計を指示します。ビューをレンダリングするために必要なものだけがビューモデルと共に渡されます。
  • ViewModel には、View に関連するデータと動作のみが含まれます
于 2013-03-15T12:22:41.857 に答える
2

あなたは正しい考えを持っているようです。通常、ビュー モデルをビューに渡す必要があります。特に、このような 2 つ以上のエンティティ モデルからのデータが必要な場合はそうです。このサイトでは、エンティティ モデルを送信してから、ViewBag または ViewData を介して他のデータを送信する人々をよく見かけますが、必然的に、彼らの問題の解決策はビュー モデルを使用することです。

ビュー モデルは次のようになります。

public class ViewModel
{
    public int UserId { get; set; }
    public String FirstName { get; set; }
    public String LastName { get; set; }
    public DateTime CreatedDate { get; set; }
    public String Description { get; set; }
}

このフラット化されたバージョンは、エンティティ モデル レベルではなくビュー モデル レベルでデータ注釈を追加する場合に便利です。あるビューではフィールドを要求したいが、別のビューでは要求したくない場合に便利です。

または、このように

public class ViewModel
{
   public UserModel UserModel { get; set; }
   public String Description { get; set; }
}

あなたはこれを行うことができます

public class ViewModel
{
   public UserModel UserModel { get; set; }
   public ArticleModel ArticleModel { get; set; }
}

しかし、その場合、余分なデータをビューに送信することになり、アプリの範囲が拡大するにつれて問題が発生することがよくあります。

于 2013-03-15T12:19:59.503 に答える
0

ビューがデータを表示するために必要なすべてのプロパティとコレクションを、ビューに必要な正しい形式で含むビューモデルを作成できます。このビューモデルは、UserModelインスタンスとArticleModelインスタンスを使用してコントローラーによって構築されます。これは、ビューモデルに、モデルにないプロパティがあることを意味する場合があります。その逆も同様です。

これで、モデルはすでにビュー用に設計されているように見えます。その場合は、ビューモデルでそれらのインスタンスを使用できます。不要なマッピングを避けるため。

最も重要なルールは、ビュー内からビューモデルのプロパティを簡単に使用して表示できるようにすることです。基本的なフォーマット(日付など)を適用することもできます。

提供された情報に基づいて、ビューモデル内の既存のモデルをプロパティとして使用します。おそらくすべてのモデルを表示する必要があり、追加のマッピングを回避するためです。

于 2013-03-15T12:22:08.327 に答える
0

通常、同様の構造を持つクラスが作成されます。そのため、ビュー モデルはビューから入力され、ビュー モデルから手動でモデルを更新します。

プロパティをビュー モデルからモデルにプロパティごとに手動でコピーするか、リフレクションを使用してコピーするか、自動マッパーなどの API を使用することができます。

于 2013-03-15T12:19:26.223 に答える