2

Asp.net と MVC 4 を使用してホテル予約 Web サイトを作成しています。連絡先のリストを持つ予約という名前のクラスがあります。作成ビューで連絡先を動的に作成したい。(連絡先の数 = 大人 + 子供、予約ビューの作成で決定されます) 連絡先情報をコントローラーに投稿するにはどうすればよいですか?

public partial class Reservation
{
    public int Id { get; set; }
    public int RoomType_Id { get; set; }
    public System.DateTime FromDate { get; set; }
    public System.DateTime ToDate { get; set; }
    public byte Adults { get; set; }
    public byte Kids { get; set; }
    public decimal Price { get; set; }
    public int User_Id { get; set; }
    public int State_Id { get; set; }
    public virtual ReservationState ReservationState { get; set; }
    public virtual RoomType RoomType { get; set; }
    public virtual User User { get; set; }
    public virtual ICollection<Transaction> Transactions { get; set; }
    public virtual ICollection<Contact> Contacts { get; set; }
}

連絡先の最大数を設定する必要があります (たとえば 5 で、次のように記述しますか?

    [HttpPost]
    public ActionResult Create(Reservation reservation,Contact Adult1,Contact Adult2, Contact Adult3, Contact Adult4, Contact Adult5, Contact Kid1,Contact Kid2, Contact Kid3)
    {
        if(reservation.Adults>0)
            reservation.Contacts.Add(Adult1);
        if(reservation.Adults>1)
            reservation.Contacts.Add(Adult2);
        ...
        if (ModelState.IsValid)
        {
            _db.Reservations.Add(reservation);
            _db.SaveChanges();
            return RedirectToAction("Index");
        }
    }

とても汚いです。もっと良い方法はありますか?連絡先のリストを渡すことはできますか?

4

1 に答える 1

4
@for (var i = 0; i < Model.Contacts.Count(); i++)
{
    @Html.EditorFor(m => m.Contacts[i])
}

必要なのは、新しい連絡先のリストをインスタンス化することだけです。これが、ビューモデルの値に基づいてコンストラクターでこれを簡単に実行できるため、ビューモデルが望ましい理由です。

public class ReservationViewModel
{
    public ReservationViewModel()
    {
        Contacts = new List<Contact>();
        for (var i = 0; i < Adults + Kids; i++)
        {
            Contacts.Add(new Contact());
        }
    }

    ...
}

または、生成されたコードを確認した後、モデルバインダーがデータを受け取る方法を理解できます。入力は次のようになります。

<input id="Contacts_0__Name" name="Contacts[0].Name" />

0連絡先の反復回数はどこにありますか。この構造を手動でシミュレートすると、モデルバインダーは同様にデータを取得します。

于 2013-04-01T15:13:38.060 に答える