0

私はこのMVC環境に非常に慣れていないため、ViewModelを使用することは良い習慣のようですが、インターネットでのすべての調査結果の後、ViewModelを自分のケースに適用する方法がよくわかりません.

Cust_IDpart_IDdress_IDの 3 つの列を持つメイン テーブル ( Customer ) があります。part_IDdefaultValueの 2 つの列を持つBodyという名前の別のテーブルを作成します。また、 dress_IDpart_ID、およびLOVの3 つの列を持つDressという名前の別のテーブルも用意します。


Customerテーブルには、顧客情報と各パーツの好みのドレスが格納されます。
ボディテーブルには、各パーツのデフォルト値が格納されます。
ドレステーブルには、さまざまなパーツで使用可能なドレスの値のリストが格納されます。

私の見解では、本文テーブルのデータに応じていくつかのドロップダウン リストを作成し、ドロップダウン リストに対応する値のリストを表示して、顧客が選択できるようにします。ビューモデルを実装してソリューションを実際に設計するにはどうすればよいですか? どんな助けでも大歓迎です。
以下に私のデータベースのサンプルデータを示します:

ここに画像の説明を入力

そして、以下のように私の期待されるビュー: ここに画像の説明を入力

4

3 に答える 3

2

ビュー モデルには、ビューに必要なすべてのデータが含まれているだけです。それでおしまい。特別なデザインや魔法はありません。

Web ページに 10 個のフォーム フィールドがある場合、ビュー モデルに 10 個のプロパティがマップされます。非表示フィールド (ID など) やサポート データ (ドロップダウン リストのコレクションなど) もある場合があります。

ビューを厳密に型指定できるようにするために、ビューの要件をクラスに 1 対 1 でマッピングするだけです。

コントローラーでは、何らかの方法でデータ モデルとビュー モデルをマッピングします。AutoMapper などのフレームワークを使用してこれを行うことも、カスタム コードを記述してこのマッピングを行うこともできます。いずれにせよ、GET でデータ モデルからビューに必要なデータをコピーするだけで、POST で結果をデータ モデルにマップして変更を保存します。

ビュー モデルはデータ モデルと非常によく似ている (または同一でさえある) 場合があり、これを 2 回行うのは余分な作業のように思えるかもしれません。変化します。また、特定のセキュリティ問題の発生を防ぐのにも役立ちます。

ビュー モデルをどのように構築するかは、データをどのように消費するかによって異なります。データ モデルを単純にフラット化し、複数のテーブルを取得して 1 つのクラスに変換することができます。または、ビューで反復処理される一連のオブジェクトを作成することもできます。これはすべて、あなたが何をしたいかによって異なります。

ビューモデルの概念は実にシンプルで、考えすぎだと思います。ビューが必要とするのは単なるデータです。それで全部です。また、たまたまデータ モデルに似ていない限り、データ モデルとは何の関係もありません。

于 2013-09-03T03:22:14.950 に答える
1

私が正しく理解していれば

ドレス テーブルと顧客テーブル - 1 対多のリレーションシップ

Body テーブルと Customer テーブル - 1 対多の関係

ボディ テーブルとドレス テーブル - 1 対多の関係

もしそうなら、あなたのモデルデザインは以下のようになります。

public class Customer
    {
        public int CustomerID { get; set; }
        public List<Body> parts { get; set; }
        public List<Dress> dresses { get; set; }

        public Customer()
        {
            this.parts = new List<Body>();
            this.dresses = new List<Dress>();
        }


    }

    public class Body
    {
        public int PartID { get; set; }
        public string DefaultValue { get; set; }
        public Customer customer { get; set; }
        public Dress dress { get; set; }
    }

    public class Dress
    {
        public int DressID { get; set; }
        public int PartID { get; set; }
        public string LOV { get; set; }

        public Customer customer { get; set; }

        public List<Body> parts { get; set; }

        public Dress()
        {
            this.parts = new List<Body>();
        }
    }

ドレス モデルのビューの実装例を作成します。

コントローラ:

public ActionResult Create()
        {
            List<Body> bodies = new List<Body>()
            { 
                new Body{PartID=1,DefaultValue="Default1"},
                new Body {PartID=2,DefaultValue="Default2"},
                new Body {PartID=3,DefaultValue="Default3"}
            };

            Dress dress = new Dress();
            dress.parts = bodies;

            return View(dress);
        }

意見:

@model Mvc4Test.Models.Dress

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Dress</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.PartID)
        </div>
        <div class="editor-field">

            @Html.DropDownListFor(x => x.parts, new SelectList(Model.parts,"PartID","DefaultValue"))
            @Html.ValidationMessageFor(model => model.PartID)
        </div>
        <br /><br />
        <div class="editor-label">
            @Html.LabelFor(model => model.LOV)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.LOV)
            @Html.ValidationMessageFor(model => model.LOV)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
于 2013-09-02T09:47:04.267 に答える