我正在用Asp.net和MVC 4撰写酒店预订网站。 它有一个名为reservation的类,它有一个联系人列表。在创建视图中,我想动态创建联系人。 (联系人数量=成人+儿童,将在创建预订视图中确定) 我怎么能把联系信息发给控制器?
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");
}
}
这是非常脏的还有更好的方法吗?我可以通过联系人列表吗?
答案 0 :(得分: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
是联系人的迭代计数。如果您手动模拟此结构,模型绑定器也会同时获取数据。