1

私は自分自身にasp .net mvc3を教えています。

さまざまなモデルとルックアップ タイプのデータベースを使用する部分ビューがあります。強く型付けしたまま複数の場所で使用したいのですが、実装方法がわかりません。以下の例は、それをよりよく説明するはずです。この質問は少し長くなる可能性があります。ご理解のほどよろしくお願いいたします。

部分ビューは、基本的にプロパティの簡単な説明を提供します。「_PropertyExcerptPartial」のスニペットを以下に示します。

@model Test.ViewModels.PropertyExcerptViewModel

<div>
    <h3>@Html.DisplayFor(model => model.Property.NoOfBedrooms) bedroom @Html.DisplayFor(model => model.FurnitureType.FurnitureTypeDescription) flat to Rent </h3>
…
</div>

この部分ビューを強く型付けしたままにして、複数の場所で使用したいと考えています。強く型付けされるモデルは次のとおりです。

public class PropertyExcerptViewModel
{
    public Property Property { get; set; }
    public FurnitureType FurnitureType { get; set; }
}

このモデルが参照する 2 つのデータベースは次のとおりです。

 public class Property
 {
    public int PropertyId {get; set; }       
    ...
    public int NoOfBedrooms {get; set;}
    public int FurnishedType { get; set; }
    ...
 }

public class FurnishedType
{
    public int FurnishedTypeId { get; set; }
    public string FurnishedTypeDescription { get; set; }
}

家具付きタイプ データベースは、基本的に次のデータを含むルックアップ テーブルです。 1 - 家具付き 2 - 家具なし 3 - 一部家具付き 4 - 交渉可能

説明の検索に使用できるプロパティ データベースに int 値のみを格納するという点で、このような検索が多数あります。これらのデータベースはプロパティ データベースにリンクされておらず、家具タイプの値は関数 GetFurnitureType(id) を介して読み取られます。Property.FurnitureType の格納された int 値を ID として渡します。

ただし、これらの複数のモデルをビューから部分ビューに渡す方法がわからないため、この部分ビューを使用しようとすると問題が発生します。

「追加されたプロパティ」ページを作成しようとしているとします。このページには、基本的に、ログインしたユーザーが追加したプロパティが一覧表示されます。これを容易にするために、特定のユーザーが追加したプロパティを返す GetAddedProperties(userId) という別の関数を作成しました。「追加されたプロパティ」ビューでは、foreach 関数を呼び出して、GetAddedProperties によって返されたすべてのプロパティをループし、_PropertyExcerptPartial を表示できます。このようなもの:

<div>
    @foreach (var item in //Not sure what to pass here)
    {
        @Html.Partial("_PropertyExcerptPartial",item)
    }
</div>

ただし、部分ビューを使用して情報を表示することはできません。これは、プロパティ データベースに格納されている家具タイプの int 値を表示するためです。また、対応する FurnitureTypeDescription を取得して、「追加されたプロパティのページ。

どんな助けでも大歓迎です。どうもありがとう!

4

1 に答える 1

4

ViewModel名前の接尾辞を付けてドメインモデルを内部に詰め込むクラスではなく、実際のビューモデルを設計することから始める必要があります。それはビューモデルではありません。

したがって、ビューで操作する必要のある情報を考えて、実際のビューモデルを設計します。

public class PropertyExcerptViewModel
{
    public int NoOfBedrooms  { get; set; }
    public string FurnishedTypeDescription { get; set; }
}

次に、このビューモデルで動作するようにパーシャルを適応させます。

@model Test.ViewModels.PropertyExcerptViewModel
<div>
    <h3>
        @Html.DisplayFor(model => model.NoOfBedrooms) 
        bedroom 
        @Html.DisplayFor(model => model.FurnitureTypeDescription) 
        flat to Rent 
    </h3>
    ...
</div>

さて、実際のビューモデルができたので、それをどのように設定できるか見てみましょう。したがって、基本的に、メインビューは、これらのビューモデルのコレクションに強く型付けできます。

@model IEnumerable<Test.ViewModels.PropertyExcerptViewModel>
<div>
    @foreach (var item in Model)
    {
        @Html.Partial("_PropertyExcerptPartial", item)
    }
</div>

そしてもちろん最後のビットは、メインビューに渡されるビューモデルのすべてのデータベースクエリと構築を行うメインコントローラーです。

[Authorize]
public ActionResult SomeAction()
{
    // get the currently logged in username
    string user = User.Identity.Name;

    // query the database in order to fetch the corresponding domain entities
    IEnumerable<Property> properties = GetAddedProperties(user);

    // Now let's build the view model:
    IEnumerable<PropertyExcerptViewModel> vm = properties.Select(x => new PropertyExcerptViewModel
    {
        NoOfBedrooms = x.NoOfBedrooms,
        FurnishedTypeDescription = GetFurnitureType(x.FurnishedType).FurnishedTypeDescription
    });

    // and finally pass the view model to the view
    return View(vm);    
}

SELECT N + 1トラップに陥らないように、EFが使用しているORMである場合は、EFの怠惰な性質に注意してください。

于 2012-08-28T19:02:25.303 に答える