Asp.net mvc 在视图中生成列表并将其传递给控制器

Asp.net mvc 在视图中生成列表并将其传递给控制器,asp.net-mvc,model-view-controller,asp.net-mvc-4,Asp.net Mvc,Model View Controller,Asp.net Mvc 4,我正在用Asp.net和MVC4编写一个酒店预订网站。 它有一个名为reservation的类,它有一个联系人列表。在创建视图中,我想动态创建联系人。(联系人数量=成人+儿童,将在创建预订视图中确定) 我如何将联系信息发布到控制器 public partial class Reservation { public int Id { get; set; } public int RoomType_Id { get; set; } public System.DateTime

我正在用Asp.net和MVC4编写一个酒店预订网站。 它有一个名为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; }
}
太脏了有更好的办法吗?我可以传递联系人列表吗?

@for(var i=0;i@for (var i = 0; i < Model.Contacts.Count(); i++)
{
    @Html.EditorFor(m => m.Contacts[i])
}
{ @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());
        }
    }

    ...
}
公共类ReservationViewModel
{
公共保留视图模型()
{
联系人=新列表();
对于(变量i=0;i<成人+儿童;i++)
{
联系人。添加(新联系人());
}
}
...
}
或者,在看到生成的代码后,您将了解modelbinder希望如何接收数据。您的输入将如下所示:

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

其中
0
是联系人的迭代计数。如果手动模拟此结构,modelbinder也将拾取数据。

@for(var i=0;im.Contacts[i])
}
您只需要实例化一个新联系人列表。这就是为什么视图模型更可取的原因,因为您可以根据视图模型上的某些值在构造函数中简单地执行此操作:

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

    ...
}
公共类ReservationViewModel
{
公共保留视图模型()
{
联系人=新列表();
对于(变量i=0;i<成人+儿童;i++)
{
联系人。添加(新联系人());
}
}
...
}
或者,在看到生成的代码后,您将了解modelbinder希望如何接收数据。您的输入将如下所示:

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


其中
0
是联系人的迭代计数。如果您手动模拟此结构,modelbinder也将拾取数据。

您已经可以通过
预订
类的
联系人
属性传递数据。但是,您是否考虑过在视图中使用viewmodel而不是实体?因为Model.Contacts为空。如何为不存在的联系人创建编辑器@Editorfor(Model.Contacts.?)有多种方法可以实现您的目标。对于您的特定场景,我的首选是使用jquery构建
联系人
,并通过ajax发布“inputed”集合—所有这些都使用viewmodels,而不是代理对象。但是您需要的是理解模型绑定以实现您的目标。这里有两个有用的SO链接,您可以访问:,。您已经可以通过
预订
类的
联系人
属性传递它。但是,您是否考虑过在视图中使用viewmodel而不是实体?因为Model.Contacts为空。如何为不存在的联系人创建编辑器@Editorfor(Model.Contacts.?)有多种方法可以实现您的目标。对于您的特定场景,我的首选是使用jquery构建
联系人
,并通过ajax发布“inputed”集合—所有这些都使用viewmodels,而不是代理对象。但是您需要的是理解模型绑定以实现您的目标。这里有两个有用的链接,您可以访问:。