3

私は、MVC でより多くの ViewModel と厳密に型指定された View を理解したいと思っています (そして、今はただの苦痛なので、最終的に感謝しています...)。

私のビューモデル

public class Combined
    {
        public IEnumerable<Domain> Domains { get; set; }
        public IEnumerable<RegInfo> RegInfos { get; set; }

        public Combined(IEnumerable<Domain> domains, IEnumerable<RegInfo> reginfos)
        {
            this.Domains = domains;
            this.RegInfos = reginfos;
        }

Controllerでは、データをリポジトリから Combined 型のオブジェクトに渡します。

public ActionResult RegDetails(int id = 0)
        {
            var domain = from x in unitofwork.DomainRepository.Get(n => n.ID == id)
                         select x;

            var reginfo = from y in unitofwork.ReginfoRepository.Get(n => n.ID == id)
                          select y;

            var regdetails = new Combined(domain, reginfo);

            return View(regdetails);
        }

ビュー (Razor を使用) には @model project.namespace.Combined があるため、2 つのリストを保持するオブジェクトを渡しています。

1/ この @Model.Domain.Name のような各リスト項目にアクセスできないのはなぜですか (素朴な質問ですが、その背後にあるロジックを理解するのを手伝ってください)。join を使用してビューの「レベル」から実行できますが、MVC パターンに完全に反します。これら2つのテーブルを結合する場所はコントローラーだけだと思いますが、まったく新しいオブジェクトが作成されるので、そのためのモデルを作成する必要がありますか?

2/ ビュー (結合、オートマッパー) を設定するために使用できる 2 つ以上のテーブルからデータを保持する IEnumerable オブジェクトを取得するための最良の方法は何ですか?

3/ 1 つの FORM から複数のテーブルに POST するために使用できるモデルを作成できるアプローチはありますか?

前もって感謝します。

4

2 に答える 2

5

コントローラー アクションでエンティティを取得するロジックは問題ありません。それがコントローラーの仕事です。ただし、ビュー モデルにカスタム コンストラクターは必要ありません。オブジェクトの初期化を使用するだけです。

var regdetails = new Combined { Domains = domain, RegInfos = reginfo }

さて、あなたのビューモデルに関する限り、DomainsそしてそれRegInfosIEnumerablesですが、それぞれに対して単一のオブジェクトしかフェッチしていません。リスト型を使用する場合は、LINQ を変更して複数の項目を選択する必要がありますが、実際には各項目に対して 1 つのオブジェクトのみを使用する場合IEnumerableは、ビュー モデルで s を使用しないでください。

public class Combined
{
    public Domain Domain { get; set; }
    public RegInfo RegInfo { get; set; }
}

そうすれば、インスタンスのプロパティにだけでアクセスできるようになります。ただし、それらをリスト型のままにしておく場合は、ビューでそれらをループする必要があります (リストに項目が 1 つしかない場合でも):NameDomain@Model.Domain.Name

@foreach (var domain in Model.Domains)
{
    // Do something with domain.Name
}
于 2013-10-22T15:43:23.160 に答える
2

実際にビューで Model プロパティを取得し、C# で行うように Domains プロパティと RegInfos プロパティを使用できます。例えば ​​:

@{
    var firstDomain = Model.Domains.FirstOrDefault();
    // do some process with this variable
}

または :

@foreach(var regInfo in Model.RegInfos)
{
    // do some other process        
}

表示されるデータがさまざまなデータ ソースから取得される場合は、特定のビュー モデルを作成することをお勧めします。ビューで計算を行ったり、ビジネス ルールを適用したりしないようにする必要があります。その前に、データを事前にフォーマットする必要があります。もう 1 つの利点は、必要なデータのみをビューに渡すことです。表示される 2 つのプロパティのためだけに、データベースから巨大なオブジェクト (またはコレクション) を取得したくありません。

そのビュー モデルは、フォームを送信するときにも使用できます。ポスト アクションにビュー モデル タイプのパラメーターがあり、ビューで入力を正しく生成した場合 (Html.Editor(For) などの HtmlHelper を使用して)、それを取得できます。

いずれにせよ、強く型付けされたビューについては言いたいことがたくさんあり、多くのリソースやチュートリアルがウェブ上で見つかります。

于 2013-10-22T15:41:38.820 に答える