0

詳細ビューに表示したいオブジェクトがあります。オブジェクトには、ビューが必要とする一連のプロパティがあります。

オブジェクトには親と祖父母もあり、ビューに表示する必要があります。

私がオブジェクトviewModelのために持っているものは次のとおりです。

public class ObjectViewModel
{
    // Used when creating a new object under a parent object
    [HiddenInput(DisplayValue = false)]
    public int? ParentObjectId { get; set; }

    [Required]
    public Object Object { get; set; }

    // Info that only the view needs, which is defined in the Controller based on some logic
    public string ActiveTitle { get; set; }

    // A bre
    public IList<Object> ParentObjects { get; set; } 
}

次に、これを Detail コントローラー メソッドで使用します。

public ActionResult Detail(int objectId)
{

    // TODO: Make this a service call
    var object = _db.Objects.FirstOrDefault(s => s.ObjectId == objectId);

    if (object == null)
    {
        return View("Error");
    }

    var model = new SetViewModel() { 
         ActiveTitle = object.Name, 
         Object = object, 
         ParentObjectId = object.ParentObject.ObjectId, 
         ParentObjects = _objectService.GetParentObjects(set.ParentObject)
    };

    return View(model);
}

これは正しく見えますか?それとも、オブジェクト自体 ではなく、必要なフィールドをオブジェクト モデルから viewModel にプルする必要がありますか?

4

3 に答える 3

0

ビューモデルにオブジェクトタイプを含めることは非常にあいまいであり、元のプログラマーでない場合、コードをサポートするのは困難です。以下に示すように、クラスタイプを実際のモデルに追加するか、ジェネリックを使用してクラスタイプを指定します。

public class ObjectViewModel<T>
{
    // Used when creating a new object under a parent object
    [HiddenInput(DisplayValue = false)]
    public int? ParentObjectId { get; set; }

    [Required]
    public T Object { get; set; }

    // Info that only the view needs, which is defined in the Controller based on some logic
    public string ActiveTitle { get; set; }

    // A bre
    public IList<T> ParentObjects { get; set; } 
}
于 2013-02-19T17:48:29.667 に答える
0

どちらのオプションでも機能し、特定のアプリケーションで両方の手法が混在していることがよくあります。

重要な考え方は、ユーザーにデータを表示するためにビューが必要とするものをビュー モデルに含める必要があるということです。

ビューが個々のプリミティブ フィールドを単純なコントロール (一連のラベルやテキスト ボックス コントロールなど) に表示するだけの場合、ビュー モデルは親オブジェクトではなくフィールドのみを指定する必要があります。

ただし、複雑なオブジェクト全体を表示する「方法を知っている」テンプレート化されたコントロールまたはカスタム コントロールをビューに含めることは非常に可能です。その場合、ビュー モデルにはオブジェクト全体を含める必要があります。(実際には、ASP-MVC よりも WPF でこれを頻繁に行っていますが、両方を行っています)。

于 2013-02-19T17:42:04.573 に答える
0

答えは文脈に応じたものになるようです。レイヤード アーキテクチャを使用する多くのチームは、X より下のレイヤーをビューから直接参照してはならないというアーキテクチャ上の規則を採用している可能性があり、データ アクセス クラスがそのような制限の候補になる可能性があります。あなたの場合、ビューの構造を構造に直接データベーススキーマにバインドしているように見えます (「_db」を使用しているため)。これは不当に密結合と見なされる可能性があります。

また、オブジェクトはラムダ式に ObjectId プロパティを持っているように見えるため、文字通り System.Object ではなく「一般的なもの」を表すために「オブジェクト」を使用していると思います。

于 2013-02-19T17:44:17.083 に答える