Asp.net mvc ASP.NET MVC-以一种形式处理多个对象

Asp.net mvc ASP.NET MVC-以一种形式处理多个对象,asp.net-mvc,Asp.net Mvc,我有一个场景我被卡住了-我有一个域对象,它有一个对象集合连接到它。大概是这样的: public class Person { public string Name { get; set; } public IList<PhoneNumber> PhoneNumbers {get; set; } public IList<Address> Addresses { get; set; } } 公共类人物 { 公共字符串名称{get;set;} 公共ILis

我有一个场景我被卡住了-我有一个域对象,它有一个对象集合连接到它。大概是这样的:

public class Person
{
   public string Name { get; set; }
   public IList<PhoneNumber> PhoneNumbers {get; set; }
   public IList<Address> Addresses { get; set; }
}
公共类人物
{
公共字符串名称{get;set;}
公共IList电话号码{get;set;}
公共IList地址{get;set;}
}
客户端需要的UI有一个用于添加和编辑的输入表单。用户可以为每个人输入0到多个电话/地址。如何处理将值集合发回控制器


我可以想出几种方法,但它们似乎都是蛮力的,不是很优雅。有处理这类问题的最佳实践吗

在过去,我用railsy惯例来做这件事

<input name="Parent[childObjectType][serial_number]" type="textbox" value="" />

所以对于你的情况

<input name="Person[PhoneNumber][1]" type="TextBox" value="555-1212" />
<input name="Person[PhoneNumber][2]" type="TextBox" value="555-555-1212" />

您可以增加序列号并在javascript中复制元素以获得多个,并在操作中使用formCollection,这将为您提供获取这些元素的方法

mvc团队的默认设置是使用ModelBinder和点语法进行此操作。
然而,这使得jquery和其他javascript框架变得很笨拙。

我已经开始使用json和jquery,在服务器端使用json.NET和JsonFilter将复杂类型发布到控制器操作,它会自动获取json对象并将其序列化为等效的C类型。我发现这是一个非常干净的解决方案,更容易测试。您可以查看这篇文章,并下载示例代码,以开始了解如何执行此操作。这很直截了当


框架通过使用特殊的“表单布局”来支持它。Phil Haack有一篇关于这个的文章

编辑Scott Hanselman()刚刚发布了一个更新。此外,在RC1中,似乎(昨晚遇到这个mysel)索引需要以0为基础并稳步增加(至少如果您正在“绑定”IList)


Edit2链接似乎不起作用

在提到Hanselman的帖子中,他写道,你不需要索引,你只需要输入框有相同的名称,并且有一个数组参数在起作用,它就起作用了。

我已经做过几次了,并使用Phil Haack的帖子作为指导。这是我最后一次发现如何使用编辑器模板。把这篇文章贴在这里,希望它能帮助其他人(如果我忘了的话,也可以帮助我)

这里我的例子是使用地址(为了简洁起见,只使用一个属性)

AddressViewModel.cs

public class AddressViewModel
{
    public string Address1 { get; set; }
}
public class AddressViewModels : List<AddressViewModel>
{
}
public class PersonViewModel
{
    public AddressViewModels HomeAddresses { get; set; }
}
AddressViewModels.cs

public class AddressViewModel
{
    public string Address1 { get; set; }
}
public class AddressViewModels : List<AddressViewModel>
{
}
public class PersonViewModel
{
    public AddressViewModels HomeAddresses { get; set; }
}
AddressViewModel.cshtml(编辑器模板)

@model AddressViewModel
@LabelFor(m=>m.Address1)
@Html.TextBoxFor(m=>m.Address1)
AddressViewModels.cshtml(编辑器模板)

@model AddressViewModels
@对于(var i=0;iModel[i])
}
Person.cshtml

@model Person

<h3>Edit Addresses</h3>
@Html.EditorFor(m => m.HomeAddresses)
<button type="submit">Save</button>
@模特儿
编辑地址
@EditorFor(m=>m.HomeAddresses)
拯救
呈现的HTML

<input id="HomeAddresses_Index" name="HomeAddresses.Index" type="hidden" value="0">
<label for="HomeAddresses_1__Address1">Address 1</label>
<input id="HomeAddresses_1__Address1" name="HomeAddresses[1].Address1" type="text" value="P.O.Box 123" >
<button type="submit">Save</button>

地址1
拯救