1

私は自分自身にasp.netmvc3を教えています。私はたくさんの研究をしましたが、読むほど混乱します。ユーザーが自分の物件を販売または賃貸するために登録できるページを作成したいと思います。

次のようなデータベースを作成しました。

public class Property
    {
        public int PropertyId { get; set; }
        public int PropertyType { get; set; }
        ···
        public int Furnished { get; set; }
        ...
}

ここで、dropdownlistfor=PropertyTypeとFurnishedが必要です。

物件タイプは1フラット2ハウス3戸建住宅..。

家具付きは次のようになります:1家具付き2家具なし3Part家具付き..。

さて、この情報をコードのどこに保存するのか本当にわかりません。このルックアップを格納する2つのテーブルをデータベースに含める必要がありますか?または、すべてのルックアップを持つ1つのテーブルが必要ですか?または、この情報をモデルに保持する必要がありますか?

モデルはどのようにPropertyTypeにバインドされ、Propertyエンティティで提供されますか?

ありがとう!

4

2 に答える 2

2

プロパティタイプと提供されたタイプをデータベースに保存することで、整数IDを保存するだけでなく、外部キーを使用してデータの整合性を強化できるため、これを強くお勧めします。

また、新しいタイプを追加したい場合に備えて、将来にわたって利用できることも意味します。値は頻繁に変更されない/変更されないことはわかっていますが、将来バンガロー/メゾネットを追加したい場合は、プロジェクトを再構築してデプロイする必要はなく、データベースに新しい行を追加するだけです。

これがどのように機能するかという点では、データベースモデルを直接渡すのではなく、ビューに渡されるViewModelを使用することをお勧めします。このようにして、データベースモデルをビューから分離すると、ビューには必要なものだけが表示されます。また、ドロップダウンリストなどが強く型付けされており、ViewBagにスローされるだけでなく、ビューモデルに直接含まれていることも意味します。ビューモデルは次のようになります。

public class PropertyViewModel
{
    public int PropertyId { get; set; }

    public int PropertyType { get; set; }
    public IEnumerable<SelectListItem> PropertyTypes { get; set; }

    public int Furnished { get; set; }
    public IEnumerable<SelectListItem> FurnishedTypes { get; set; }
}

したがって、コントローラーのアクションは次のようになります。

public class PropertiesController : Controller
{
    [HttpGet]
    public ViewResult Edit(int id)
    {
        Property property = db.Properties.Single(p => p.Id == id);

        PropertyViewModel viewModel = new PropertyViewModel
            {
                PropertyId = property.Id,
                PropertyType = property.PropertyType,
                PropertyTypes = from p in db.PropertyTypes
                                orderby p.TypeName
                                select new SelectListItem
                                    {
                                        Text = p.TypeName,
                                        Value = g.PropertyTypeId.ToString()
                                    }
                Furnished = property.Furnished,
                FurnishedTypes = from p in db.FurnishedTypes
                                orderby p.TypeName
                                select new SelectListItem
                                    {
                                        Text = p.TypeName,
                                        Value = g.FurnishedTypeId.ToString()
                                    }

            };

        return View();
    }

    [HttpGet]
    public ViewResult Edit(int id, PropertyViewModel propertyViewModel)
    {
        if(ModelState.IsValid)
        {
            // TODO: Store stuff in the database here
        }

        // TODO: Repopulate the view model drop lists here e.g.:
        propertyViewModel.FurnishedTypes = from p in db.FurnishedTypes
                                orderby p.TypeName
                                select new SelectListItem
                                    {
                                        Text = p.TypeName,
                                        Value = g.FurnishedTypeId.ToString()
                                    };

        return View(propertyViewModel);
    }
}

そして、あなたの見解は次のようになります。

@Html.LabelFor(m => m.PropertyType)
@Html.DropDownListFor(m => m.PropertyType, Model.PropertyTypes)
于 2012-08-20T14:44:25.047 に答える
0

私は通常、コード内の列挙を使用してこの種の状況を処理します。

public enum PropertyType {
    Flat = 1,
    House = 2,
    Detached House = 3
}

次に、あなたの見解では:

<select>
@foreach(var val in Enum.GetNames(typeof(PropertyType)){
    <option>val</option>
}
</select>

オプションのIDを列挙型の各項目の値と等しく設定して、コントローラーに渡すことができます。

編集:あなたの質問に直接答えるために:あなたはそれらをルックアップとしてデータベースに保存することができますが、物事を変える可能性が低い小さなもののために、私は通常列挙型を使用し、往復を節約します。

また、このアプローチも見てください。私のものよりも見栄えがよいので、 HTML.EditorForをドロップダウン(html.dropdownfor?)に変換します。

于 2012-08-19T18:50:10.060 に答える